目錄
JWT
會(huì)話跟蹤
token
響應(yīng)攔截器
http是無狀態(tài)的,登錄成功后,客戶端就與服務(wù)器斷開連接,之后再向后端發(fā)送請(qǐng)求時(shí),后端需要知道前端是哪個(gè)用戶在進(jìn)行操作。
JWT
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一 種基于 JSON 的開放標(biāo)準(zhǔn)((RFC 7519).定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以 JSON 對(duì)象的形式安全的傳遞信息。
會(huì)話跟蹤
1. 用戶使用賬號(hào)和密碼發(fā)出 post 請(qǐng)求;
2. 服務(wù)器使用私鑰創(chuàng)建一個(gè) jwt;
public class JWTUtil {
/**
* 根據(jù)用戶id,賬號(hào)生成token
* @param admin
* @return
*/
public static String getToken(Admin admin) {
String token = "";
try {
//過期時(shí)間 為1970.1.1 0:0:0 至 過期時(shí)間 當(dāng)前的毫秒值 + 有效時(shí)間
Date expireDate = new Date(new Date().getTime() + 10*1000);
//秘鑰及加密算法
Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
//設(shè)置頭部信息
Map<String,Object> header = new HashMap<>();
header.put("typ","JWT");
header.put("alg","HS256");
//攜帶id,賬號(hào)信息,生成簽名
token = JWT.create()
.withHeader(header)
.withClaim("id",admin.getId())
.withClaim("account",admin.getAccount())
.withExpiresAt(expireDate)
.sign(algorithm);
}catch (Exception e){
e.printStackTrace();
return null;
}
return token;
}
/**
* 驗(yàn)證token是否有效
* @param token
* @return
*/
public static boolean verify(String token){
try {
//驗(yàn)簽
Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e) {//當(dāng)傳過來的token如果有問題,拋出異常
return false;
}
}
/**
* 獲得token 中playload部分?jǐn)?shù)據(jù),按需使用
* @param token
* @return
*/
public static DecodedJWT getTokenInfo(String token){
return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
}
}
3. 服務(wù)器返回這個(gè) jwt 給瀏覽器;
4. 瀏覽器將該 jwt 串在請(qǐng)求頭中像服務(wù)器發(fā)送請(qǐng)求;
5. 服務(wù)器驗(yàn)證該 jwt;
6. 返回響應(yīng)的資源給瀏覽器。
由于在每次的前后端交互過程中都需要進(jìn)行token的驗(yàn)證,為了降低代碼的冗余,可以借助過濾器來幫助我們完成這個(gè)工作。
public class AdminTokenFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
String adminToken = request.getHeader("adminToken");
boolean verify = JWTUtil.verify(adminToken);
if(verify){
filterChain.doFilter(servletRequest, servletResponse);
}else {//token驗(yàn)證失敗
servletResponse.setContentType("text/html;charset=utf-8");
PrintWriter printWriter = servletResponse.getWriter();
CommonResult commonResult = new CommonResult(401, "token驗(yàn)證失敗");
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(commonResult);
printWriter.write(json);
}
}
}
token
1.將后端封裝好的信息發(fā)送給前端
2.前端接收后存儲(chǔ)在sessionStorage對(duì)象中
3.在后面每次發(fā)送請(qǐng)求時(shí)都將token放入請(qǐng)求頭中發(fā)送到后端進(jìn)行驗(yàn)證
4.后端在對(duì)token進(jìn)行解析
響應(yīng)攔截器
如果token驗(yàn)證失敗,后端向前端傳回一個(gè)標(biāo)識(shí)用于告訴前端token驗(yàn)證失敗
在前端main.js中添加攔截器文章來源:http://www.zghlxwxcb.cn/news/detail-647209.html
// 添加響應(yīng)攔截器
axios.interceptors.response.use((resp) => { //正常響應(yīng)攔截
if (resp.data.code == 500) {
ElementUI.Message({
message: resp.data.message,
type: "error"
})
}
if (resp.data.code == 401) {//自定義的狀態(tài)碼
ElementUI.Message({
message: "token驗(yàn)證失敗",
type: "error"
})
router.replace("/login");
}
return resp;
});
這樣每次前端進(jìn)行操作時(shí)都會(huì)先驗(yàn)證token文章來源地址http://www.zghlxwxcb.cn/news/detail-647209.html
到了這里,關(guān)于web會(huì)話跟蹤以及JWT響應(yīng)攔截機(jī)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!