java如何做扫码登录
实现扫码登录的基本流程
扫码登录的核心流程分为两部分:前端生成二维码并轮询状态,后端验证扫码结果并返回登录态。用户使用手机APP扫描网页二维码后,APP将用户信息与二维码绑定,网页通过轮询获取登录状态完成跳转。
生成二维码与唯一标识
后端需生成一个唯一的临时令牌(如UUID)作为二维码标识,并设置较短的有效期(通常5分钟)。该令牌需存储在Redis等缓存中,初始状态为"未扫描"。
String qrToken = UUID.randomUUID().toString();
redisTemplate.opsForValue().set("qr:" + qrToken, "waiting", 300, TimeUnit.SECONDS);
前端通过接口获取该令牌后,使用QRCode.js等库生成二维码,内容通常为包含令牌的URL(如app://scan?token=xxx)。

轮询检查扫码状态
前端需定时调用检查接口(每2-3秒),查询当前令牌状态。后端根据缓存中的状态返回不同响应:
String status = redisTemplate.opsForValue().get("qr:" + qrToken);
if ("confirmed".equals(status)) {
String userId = redisTemplate.opsForValue().get("qr:user:" + qrToken);
return new Response(STATUS_CONFIRMED, userId);
} else if ("scanned".equals(status)) {
return new Response(STATUS_SCANNED);
} else {
return new Response(STATUS_WAITING);
}
移动端确认机制
当APP扫描二维码后,应先向后端发送扫描通知,此时状态变更为"已扫描"。APP展示确认界面,用户点击确认后:

// APP调用确认接口
redisTemplate.opsForValue().set("qr:" + qrToken, "confirmed", 300, TimeUnit.SECONDS);
redisTemplate.opsForValue().set("qr:user:" + qrToken, userId, 300, TimeUnit.SECONDS);
安全防护措施
需防范二维码劫持和重复使用攻击。建议措施包括:
- 每次状态变更需验证请求来源(APP需携带签名)
- 二维码令牌严格一次性有效
- 敏感操作需二次验证
- 使用HTTPS保证传输安全
完整登录态处理
当后端返回"已确认"状态时,前端应获取用户ID并换取Session或JWT:
String jwt = JWT.create()
.withSubject(userId)
.sign(Algorithm.HMAC256(secret));
response.addHeader("Authorization", "Bearer " + jwt);
超时与异常处理
需处理二维码过期(返回408状态码)、用户取消(APP调用取消接口)等情况。前端在超时后应重新生成二维码。






