最近单位又有一个新Java项目。
涉及到扫码登录。之前项目使用的是 ajax轮询的方式。感觉太low了。
所以这次用webSocket的方式进行实现
好。废话不多说!咱们开始!!
一、首先咱们需要一张表
这表是干啥的呢?就是记录一下谁扫码了。谁登录了。
User_Token表
字段如下:
-
uuid : 用于确保唯一性
-
userId :谁登录的
-
loginTime :登录时间
-
createTime :创建时间 用于判断是否过期
-
state:是否二维码失效 0有效 1失效
推荐下自己做的 Spring Boot 的实战项目:
https://github.com/YunaiV/ruoyi-vue-pro
二、角色都有哪些
咱们还需要分析一下子。扫码登录这个业务逻辑都有哪些角色
-
android端 or 微信Web端 :扫码
-
PC端 :被扫。登录
-
服务端:掌控全局,提供接口。
推荐下自己做的 Spring Cloud 的实战项目:
https://github.com/YunaiV/onemall
三、接口都需要哪些?
有了角色。你用大腿也能想出来接口了对不对!!
所以咱们的接口有2个!
-
生成二维码接口:生成一个二维码。二维码中有UUID。
-
确认身份接口:确定身份以及判断是否二维码过期等
四、步骤
那句话怎么说的来着。要把大象装冰箱一共分几步?
-
PC端打开。调用生成二维码接口 并与 服务端建立链接。链接使用uuid进行绑定
-
微信Web端进行扫码。获取二维码中的uuid。
-
微信Web端拿到uuid以后。显示是否登录页面。点击确定后 调用 确认身份接口。
-
确认身份接口通过以后。服务端给PC端发送信息。完成登录。此时链接断开。
好了!分析完了这些。你们一定在想。。还有完没完啊。。不要在BB了。。赶紧贴代码吧。。
作者:观众老爷们。我这是在教给你们如何思考的方法呀?
那么开始贴代码吧!希望大家在看到的同时也可以自己进行思考。
五、疯狂贴代码
首先需要获取二维码的代码对不对!贴!
//获取登录二维码、放入Token
@RequestMapping(value = "/getLoginQr" ,method = RequestMethod.GET)
public void createCodeImg(HttpServletRequest request, HttpServletResponse response){
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
try {
//这里没啥操作 就是生成一个UUID插入 数据库的表里
String uuid = userService.createQrImg();
response.setHeader("uuid", uuid);
// 这里是开源工具类 hutool里的QrCodeUtil
// 网址:http://hutool.mydoc.io/
QrCodeUtil.generate(uuid, 300, 300, "jpg",response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
有了获取二维码的接口。相对的前端需要调用。
知识点:动态加载图片流并取出he