在登錄的過程中,使用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, "登錄成功");
}
}