天天看點

前後端分離,使用websocket重新整理token

之前提到過重新整理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連接配接:

前後端分離,使用websocket重新整理token

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發生了錯誤")
            }
        }
    }
           

繼續閱讀