首頁  >  文章  >  Java  >  Java實作二維碼掃碼授權登陸

Java實作二維碼掃碼授權登陸

little bottle
little bottle轉載
2019-04-09 14:03:084165瀏覽

如今的生活中,登入網站也變得如此簡單,當你已經登入一微信時,當你想要登入另一個網站時,只需掃碼便可,可是大家知道用Java怎麼實現掃碼授權嗎?本文講述的就是關於如何用Java實現掃碼授權登錄,一起來了解一下吧。

假設現在有2個設備,A設備需要掃碼授權登陸,B設備是已經登陸了的設備。然後實作如下文所示,

一:A裝置產生產生二維碼:

A裝置向伺服器請求getLoginCode接口,這個介面依照請求的sessionId進行base64或其他加密方式進行加密,然後以此作為二維碼的值,並將這個loginCode寫到redis裡,設定5分鐘過期。然後將這個loginCode回傳給A設備,A設備以此值來產生登陸的二維碼。

二:B設備掃碼授權

B設備來掃A設備的二維碼的時候,攜帶二維碼的值,請求授權登陸的接口scanConfirmLogin,此接口裡先校驗二維碼是否過期,沒過期的話進行後面的業務邏輯處理,將使用者的基本資訊和token寫到redis裡。

三:A設備輪詢獲取授權狀態

B設備以每秒一次的頻率來刷獲取用戶授權狀態接口,若狀態為已授權,拿到用戶信息去做後面的邏輯處理。

		/**
	 * 获取扫描登陆的二维码
	 * @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));
	}	

【推薦課程:Java影片課程

#

以上是Java實作二維碼掃碼授權登陸的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除