前后端分离,使用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连接:

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发生了错误")
            }
        }
    }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值