之前提到過重新整理token的思路:關于重新整理token的幾點思考
現在,springBoot + vue的項目中,使用websocket重新整理token,來解決token過期後如何重新整理的問題。
思路也很簡單,就是在出現token解析出現過期異常時,捕獲它,重新生成token,一般會設定一個時間限制,不然沒有意義。
後端主要代碼:
boolean validateToken(String authToken,String username){
try {
Jwts.parser().setSigningKey(key).parseClaimsJws(authToken);
return true;
} catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) {
logger.info("Invalid JWT signature.");
e.printStackTrace();
} catch (ExpiredJwtException e) {
logger.info("Expired JWT token.");
if (canRefreshToken()){
// 在規定的過期時間内,可以重新整理token
String refreshToken = refreshTokenUtil.refreshToken(username, UserInfoUtil.getPasswordByUsername(username));
logger.info("重新整理token: "+refreshToken);
try {
WebSocketServer.sendInfo(securityProperties.getTokenStartWith() + refreshToken,UserInfoUtil.getUserIdByUsername(username));
}catch (IOException e1){
logger.info("推送重新整理token失敗");
}
}else {
logger.info("token過期超過了 {} 分鐘,無法重新整理",refreshInterval/1000/60);
e.printStackTrace();
}
} catch (UnsupportedJwtException e) {
logger.info("Unsupported JWT token.");
e.printStackTrace();
} catch (IllegalArgumentException e) {
logger.info("JWT token compact of handler are invalid.");
e.printStackTrace();
}
return false;
}
後端在規定時間内,可以傳回重新整理的token,前端通過websocket接受
前端在登入成功之後,進行websocket連接配接:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL6lEVNhmWtJGcohFZwZ0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4AjNxIDNzMjMxAjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
openSocket代碼:
//開啟連接配接
export function openSocket(userId) {
if(typeof(WebSocket) == "undefined") {
console.log("您的浏覽器不支援WebSocket");
}else{
console.log("您的浏覽器支援WebSocket");
var socketUrl="ws://localhost:8888/ws/"+getUserId()
// socketUrl=socketUrl.replace("https","ws").replace("http","ws")
console.log(socketUrl);
if(socket!=null){
socket.close()
socket=null
}
socket = new WebSocket(socketUrl)
//打開事件
socket.onopen = function() {
console.log("websocket:已建立連接配接")
};
//獲得消息事件
socket.onmessage = function(msg) {
//console.log("收到消息:" + msg.data)
store.commit('user/SET_TOKEN',msg.data)
setToken(msg.data)
};
//關閉事件
socket.onclose = function() {
console.log("websocket已關閉")
};
//發生了錯誤事件
socket.onerror = function() {
console.log("websocket發生了錯誤")
}
}
}