【Token】Token的簡單使用,移動端登錄後臺驗證token

在登錄的過程中,使用token進行驗證。

這裏用到了RSA的加密傳輸,具體的加密方式,請參考這篇博客:【RSA加密】初探RSA並簡單使用

這裏單獨建了一個表用來存儲用戶的id和token以及有效截止時間,時間是根據用戶登錄成功之後,更新有效的截止時間
在這裏插入圖片描述
建表語句:

    CREATE TABLE `app_token_record` (
      `member_id` int(11) NOT NULL,
      `app_token` varchar(64) DEFAULT NULL,
      `active_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`member_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

其中在用戶第一次登錄的時候,先查詢token表裏面是否包含當前用戶的token,如果沒有則先初始化token,如果有當前用戶的token則更新token的有效時間即可。退出登錄時,將有效時間設爲當前時間。

AppTokenRecordService.java中關於初始化和更新token的方法。

	public String initializeToken(String id) {
		Long time=System.currentTimeMillis();  
	    String d = format.format(time+(long)1000*60*60*30*24);  
	    Date date=null;
	    try {
			 date=format.parse(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}  
		//初始化token
		AppTokenRecord appTokenRecord=new AppTokenRecord();
		appTokenRecord.setMemberId(id);
		appTokenRecord.setAppToken(TokenUtil.generateToken(id));
		appTokenRecord.setActiveTime(date);
		int insertSelective = insertSelective(appTokenRecord);
		System.out.println(insertSelective);
		return appTokenRecord.getAppToken();
	}

	public void refreshInitializeToken(String memberId) {
	    Long time=System.currentTimeMillis();  
	    String d = format.format(time+(long)1000*60*60*30*24);  
	    Date date=null;
	    try {
			 date=format.parse(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}  
	     
		//更新token
		AppTokenRecord appTokenRecord=new AppTokenRecord();
		//時間設置30天
		appTokenRecord.setActiveTime(date);
		appTokenRecord.setMemberId(memberId);
		AppTokenRecord findByMemberId = findByMemberId(memberId);
	     if(findByMemberId==null){
	    	insertSelective(appTokenRecord);
	     }else{
	    	 updateByPrimaryKeySelective(appTokenRecord);
	     }		
	}

	public AppTokenRecord findByMemberId(String memberId) {
		return appTokenRecordDao.findByMemberId( memberId);
	}
	
	/**
	 * 1:token 不正確
	 * 2:token 有效
	 * 3:token 過有效期
	 * 驗證token
	 * @param token 
	 * @param request
	 * @return
	 */
	 public int  checkToken(String data, String token) {
		JSONObject obj=JSON.parseObject(data);     
		String memberId=(String)obj.get("memberId");
		AppTokenRecord findByMemberId = findByMemberId(memberId);
		if(!findByMemberId.getAppToken().equals(token)){
			return 1;
		}else{
			if(DateUtil.compareDate(findByMemberId.getActiveTime() ,new Date())==1){
				return 2;
			}else{
				return 3;
			}
		}
		
	}
	 /**
	  * 退出登錄,更改token有效期
	  * @param memberId
	  */

	public void refreshInitializeToken1(String memberId) {
			//更新token
			AppTokenRecord appTokenRecord=new AppTokenRecord();
			//時間設置30天
			appTokenRecord.setActiveTime(new Date());
			appTokenRecord.setMemberId(memberId);
		    updateByPrimaryKeySelective(appTokenRecord);
		    	
		
	} 

controller類中,中間使用到關於加密的工具類RSAUtils請參考上面的RSA加密博客

	public JSONObject memberlogin(HttpServletRequest request,HttpServletResponse response,long timestamp,String data){
		JSONObject obj = null;
		try {
			// 對前臺傳來的加密的data進行解密
			obj = RSAUtils.getContent(data);
		} catch (Exception e) {
			e.printStackTrace();
		}      
		String phone = json.getString("phoneNum");  
		String pwd = json.getString("password");
		//判斷時間有效性
		if(timestamp > System.currentTimeMillis()+(long)60*1000*3){
			return JsonUtil.getJson(20, null, "請求過期");
		}
		//登陸判斷
		ShopMember member= shopMemberService.findByMemberPhone(phone);
		if(member == null){
			return JsonUtil.getJson(30, null, "用戶不存在");
		}else if(!BCrypt.checkpw(pwd, member.getMemberPasswd())){
			return JsonUtil.getJson(40, null, "用戶密碼錯誤");
		}else {
			//登錄驗證通過後的操作
			//刷新token有效期
			appTokenRecordService.refreshInitializeToken(member.getMemberId());
			//獲取token
			AppTokenRecord appTokenRecord=appTokenRecordService.findByMemberId(member.getMemberId());
			//把token加密
			JSONObject json = new JSONObject();
			json.put("token", appTokenRecord.getAppToken());
			json.put("memberId", member.getMemberId());
			String str=String.valueOf(json);
			byte[] aa=null;
			try {
				aa=RSAUtils.encryptByPublicKey(str,ejtConfig.PUBLIC_KEY2);
			} catch (Exception e1) {
				e1.printStackTrace();
			}
			String base64 = Base64.encodeBase64String(aa);
			System.out.println(base64);
			return JsonUtil.getJson(10, base64, "登錄成功");
		}
		
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章