Dans la vie d'aujourd'hui, se connecter à un site Web est devenu si simple. Lorsque vous êtes connecté à WeChat, lorsque vous souhaitez vous connecter à un autre site Web, il vous suffit de scanner le code QR. Mais tout le monde sait comment l'utiliser. Java pour scanner le code QR Autorisé ? Cet article explique comment utiliser Java pour implémenter la connexion avec autorisation d'analyse de code. Apprenons-le ensemble.
Supposons qu'il y ait maintenant deux appareils. L'appareil A doit scanner le code QR pour autoriser la connexion, et l'appareil B est l'appareil qui a déjà été connecté. Ensuite, l'implémentation est la suivante,
1 : L'appareil A génère un code QR :
L'appareil A demande l'interface getLoginCode au serveur, et cette interface est exécutée en fonction du sessionId demandé, chiffrez avec base64 ou d'autres méthodes de chiffrement, puis utilisez-le comme valeur du code QR, écrivez ce loginCode dans redis et définissez une expiration de 5 minutes. Ensuite, ce loginCode est renvoyé au périphérique A, et le périphérique A utilise cette valeur pour générer un code QR de connexion.
Deux : l'appareil B scanne le code QR pour l'autorisation
Lorsque l'appareil B scanne le code QR de l'appareil A, il porte la valeur du code QR et demande l'interface de connexion d'autorisation scanConfirmLogin In. cette interface, vérifiez d'abord si le code QR a expiré. S'il n'a pas expiré, effectuez le traitement ultérieur de la logique métier et écrivez les informations de base et le jeton de l'utilisateur dans Redis.
Trois : l'appareil A interroge pour obtenir l'état d'autorisation
L'appareil B actualise l'interface d'état d'autorisation de l'utilisateur une fois par seconde. Si l'état est autorisé, il obtiendra les informations utilisateur et effectuera la logique suivante. traitement.
/** * 获取扫描登陆的二维码 * @param noncestr随机字符串 * @throws Exception */ @RequestMapping(value = "user/getLoginCode.json") public void getLoginCode(String noncestr,HttpServletRequest request,HttpServletResponse response) throws Exception { if(StringUtil.isBlank(noncestr)){ apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT)); return; } //参数的有效性校验在拦截器里实现 int expirationTime=300; //时效5分钟 final String sessionId=request.getSession().getId(); String loginCode=ToolUtils.getBase64(sessionId); JedisUtil.set(loginCode, loginCode, expirationTime); Map<String,Object> map=new HashMap<>(); map.put("loginCode", loginCode); map.put("expirationTime", expirationTime); apiData(request, response, ReqJson.ok(map)); } /** * 扫码确认登陆 * @param loginCode * @param request * @param response * @throws Exception */ @RequestMapping(value = "user/scanConfirmLogin.json") @AuthorizationApi public void scanConfirmLogin(@CurrentToken final Token token,String loginCode,HttpServletRequest request,HttpServletResponse response) throws Exception { if(StringUtil.isBlank(loginCode)){ apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT)); return; } String userId=token.getUserId(); Map<String,String> map=new HashMap<>(); String loginTicket=JedisUtil.get(loginCode); if(StringUtil.isBlank(loginTicket)){ //二维码过期 apiData(request, response,ReqJson.error(CommonError.TWO_DIMENSIONAL_CODE_HAS_EXPIRED)); return; } UserInfo userInfo = userInfoBiz.getUser(new UserInfo(userId)); if(userInfo==null){ apiData(request, response,ReqJson.error(UserError.USER_NOT_FOUND)); return; } //将用户信息放在缓存中 map.put(BaseConfig.ACCESS_TOKEN, token.getAccessToken()); map.put("userId", userInfo.getUserId()); map.put("rongCloudToken", userInfo.getRongCloudToken()); map.put("identity", userInfo.getIdentity()); JedisUtil.setMap(loginCode+"scanConfirmLogin", map, 300); apiData(request, response, ReqJson.ok(new Object())); } /** * 获取登陆状态 * @param loginCode * @param request * @param response * @throws Exception */ @RequestMapping(value = "user/getScanConfirmLoginStatus.json") public void getLoginStatus(final String loginCode,HttpServletRequest request,HttpServletResponse response) throws Exception { if(StringUtil.isBlank(loginCode)){ apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT)); return; } Map<String,String> map= JedisUtil.getMap(loginCode+"scanConfirmLogin"); if(map==null){ apiData(request, response,ReqJson.error(CommonError.AUTHORIZATION_HAS_EXPIRED)); return; } apiData(request, response, ReqJson.ok(map)); }
[Cours recommandé : Cours vidéo Java]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!