公司想用类似微信扫码登录功能,但受到临时二维码及永久二维码个数的限制,决定放弃公众号自带的二维码生成(还有个弊端就是每次扫码都默认打开跳转到公众号,每扫描一次打开一次公众号,造成打开多个没必要的页面)
我只说下具体思路,具体 实现步骤呵呵了
severlet3 async功能自行查阅
创建url二维码---oauth2URL--重定向相应的用户确认授权页面---返回用户信息
1.创建二维码
自己创建url二维码,创建唯一key及token,利用公众号的oauth2做跳转连接二维码
1.1 key 用类区分二维码的唯一性,token用来识别正确性,扫过过期并15分钟内过期(我用用redis实现),
oauth2不用多说,跳转后获取用户的身份
2.登录时候调用时ajax请求获取登录二维码
2.1 客户端ajax 请求获取二维码
2.2服务端返回二维码图片的base64位编码及token
web.xml 打开
<async-supported>true</async-supported>
根据客户端请求挂起请求保存到本地map或redis中
AsyncContext context=getRequest().startAsync();
// 开始请求的挂起
context.setTimeout(0);
System.out.println("ip:"+ip+"----token:"+token+"----sysCode:"+sysCode);
// 把异步上下文放在列表中以备将来之用
CONNECTIONS.put(token, context);
3.微信扫描跳转到服务端oauth2认证,获取用户身份重定向到相应的url
3.1通过微信api获取用户身份
3.2获取用户身份后重定向到想用的确认登录页面
3.3点击确认将挂起的请求返回相应的用户信息
AsyncContext context =CONNECTIONS.get(mapkey);
HttpServletResponse response = (HttpServletResponse) context.getResponse();
out.print(ret.toJson());
out.flush();
out.close();
//向挂起的请求发送事件
context.complete();
CONNECTIONS.remove(mapkey);
删除token