Servlet---Web会话跟踪 ▎token令牌

发布于:2024-08-22 ⋅ 阅读:(148) ⋅ 点赞:(0)

▍为什么要进行Web会话跟踪?

http请求是无状态的,不携带用户信息的,当用户登录成功后,之后在于服务器交互时,服务器并不知道是哪个用户发送的请求

▍Web会话跟踪

解决方法:在用户成功登录后,后端向前端响应token令牌(token令牌:用户信息),前端保存token令牌每次访问后端都先发送token令牌验证

参考资料:axios请求拦截器与添加器icon-default.png?t=N7T8https://blog.csdn.net/Dreamkidya/article/details/141333033?spm=1001.2014.3001.5501

 ▍token令牌

token需要加密我们就需要用到一个工具jwt

Jwt工具

   JWT就是用来生成token的一种方式,一种可以携带用户信息,并且可以设置秘钥加密的字符串,是安全的

第一步:安装jar包

        <!--jwt-->    加密
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.8.2</version>
        </dependency>

第二步:编写token生成类(直接引入)

package com.kid.dormServer.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.kid.dormServer.model.Admin;

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

/**
 * JWT工具类
 */
public class JWTUtil {

    /**
     * 根据用户id,账号生成token
     * @param admin
     * @return
     */
    public static String getToken(Admin admin) {
        String token = "";
        try {
            //过期时间 为1970.1.1 0:0:0 至 过期时间  当前的毫秒值 + 有效时间
            Date expireDate = new Date(new Date().getTime() + 3600*1000);
            //秘钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            //设置头部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //携带id,账号信息,生成签名
            token = JWT.create()
                    .withHeader(header) //封装在一个map对象中
                    .withClaim("id",admin.getId())
                    .withClaim("account",admin.getAccount())
                    .withExpiresAt(expireDate) //过期时间
                    .sign(algorithm);//加密(加盐)
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }
        return token;
    }

    /**
     * 验证token是否有效
     * @param token
     * @return
     */
    public static boolean verify(String token){
        try {
            //验签
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (Exception e) {//当传过来的token如果有问题,抛出异常
            return false;
        }
    }

    /**
     * 获得token 中playload部分数据,按需使用
     * @param token
     * @return
     */
    public static DecodedJWT getTokenInfo(String token){
        return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
    }

}

第三步:调取JWTUtil中的方法进行生成token

                String token = JWTUtil.getToken(admin);

第四步:将admin对象相应前端,保存在浏览器中

第五步:在vue组件中添加请求拦截器

请求拦截器icon-default.png?t=N7T8https://blog.csdn.net/Dreamkidya/article/details/141333033?spm=1001.2014.3001.5501

//axios 请求拦截,每当我们使用axios框架向后端发送请求时,都会经过拦截器
axios.interceptors.request.use(config => {
	//为请求头对象,添加 Token 验证的 token 字段
	config.headers.token = sessionStorage.getItem('token');
	return config;
})


 感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!

                                       希望路飞的笑容可以治愈努力路途中的你我!

博主vx:Dreamkid05 --->欢迎大家和博主讨论问题 


网站公告

今日签到

点亮在社区的每一天
去签到