登陸權限--token 的生成和驗證


 在前后端分離時,實現登陸權限控制。 在這使用token來處理,提前說明后端采用的是SSM框架 

后端需要完成的操作如下:

1、生成token的工具類TokenUtil(內含用戶名+密碼生成token值和token驗證是否正確的兩個方法):

package com.lw.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class TokenUtil {
private static final long EXPIRE_TIME = 15 * 60 * 1000; // 設置過期時間為15分鍾
private static final String TOKEN_SECRET = "JNVCOR&$@)_(#VSZ+_?CV}{XNVM^&"; // 設置簽名私鑰
/**
* 生成token,可以將你認為需要的數據當成參數存入
*/
public static String sign(String userName,String password) {
try {
// 設置過期時間
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
// 私鑰和加密算法
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
// 設置頭部信息
Map<String, Object> header = new HashMap<String, Object>(2);
header.put("Type", "Jwt");
header.put("alg", "HS256");
// 返回token字符串
return JWT.create()
.withHeader(header)
.withClaim("userName", userName)
.withClaim("password",password)
.sign(algorithm);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 檢驗token是否正確語句
*/
public static boolean verify(String token){
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e){
return false;
}
}

/**
* 獲取token中的參數值
* @param token
* @return
*/
public static String getUserName(String token){
try{
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("userName").asString();
}catch (Exception e){
return null;
}

}
/**
* 獲取token中的參數值
* @param token
* @return
*/
public static String getPassword(String token){
try{
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("password").asString();
}catch (Exception e){
return null;
}

}

}

2、導入工具類TokenInterceptor(獲取前端token值進行校驗是否相等)

package com.lw.controller.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.lw.util.Result;
import com.lw.util.TokenUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle) throws Exception {

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Content-Type", "application/json;charset=utf-8");
String token = request.getHeader("token"); //獲取在前端存儲的token值。

response.setCharacterEncoding("utf-8");
//跨域ajax請求,都會先發一次method為OPTIONS的預請求
//1、獲取服務器支持的HTTP請求方法。
//2、用來檢查服務器的性能。例如:AJAX進行跨域請求時的預檢,需要向另外一個域名的資源發送一個HTTP OPTIONS請求頭,用以判斷實際發送的請求是否安全。
if (request.getMethod().equals("OPTIONS")) {
System.out.println("OPTIONS");
response.setStatus(HttpServletResponse.SC_OK);
return true;

}
else if (null != token) {
           //token不為空,驗證是否token是否正確
if ( TokenUtil.verify(token)) {
return true;
}
}
Result result = Result.err("用戶過期,請重新登錄");
String json = JSONObject.toJSONString(result);
response.getWriter().write(json);
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}


3、在Spring-mvc.xml文件中配置token攔截器:(起攔截作用,可設置實現未登錄時不能訪問該頁面權限)
 <!--配置token校驗攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/topic/comment"/>
<mvc:mapping path="/topic/send"/>
<mvc:mapping path="/topic/like"/>
<mvc:mapping path="/topic/unlike"/>
<mvc:mapping path="/topic/delete"/>
<mvc:mapping path="/home/user/profile"/>
<mvc:mapping path="/home/user/editSubmit"/>
<bean class="com.lw.controller.interceptor.TokenInterceptor" />
</mvc:interceptor>
</mvc:interceptors>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM