SpringBoot-拦截器

 

目录

首先创建一个拦截器

 postMan设置请求头携带token

添加拦截器(生效)

ThreadLocal保存数据

首先创建一个拦截器

一个java类实现HandlerInterceptor接口,重写preHandle方法

因为要注入到ioc容器,所以类上方添加@Component注解

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

在里面获取token(jwt)

这里根据key获取到登录成功后服务器返回给前端的一个json字符串,里面对应的是token字符串

在匹配编码方式“xxx”(可以自己随便写一个字符串,要跟登录时申请token时使用的一致)

//验证token令牌,名字就是请求头带token的key值
String token = request.getHeader("key");
try {
    //申请一个验证器
    JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("xxx")).build();
    //验证token,返回解析后的jwt对象
    DecodedJWT decodedJWT = jwtVerifier.verify(token);
    //取出所有数据(如果需要的话)
    Map<String, Claim> claims = decodedJWT.getClaims();
    //能解析出就代表token正确,可以不用再取值
    return true;
}catch (Exception e){
    return false;
}

 postMan设置请求头携带token

在图中的位置,以下面格式写入要放在请求头的参数

pm.request.addHeader("key:value");

添加拦截器(生效)

新建一个java类实现WebMvcConfigurer接口,重写addInterceptors方法,把上面创建的拦截器在这里用@Autowired自动装载,类要用@Configuration注解

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器
        //放行登录注册等不需要token令牌也能访问的页面
        registry.addInterceptor(loginInterceptor).excludePathPatterns("/login","/");

registry.addInterceptor来添加拦截器

excludePathPatterns来添加跳过拦截的路径

ThreadLocal保存数据

在拦截的时候正好可以保存用户登录数据供后面使用

这里先写一个工具类,用于使用(分别写好了存数据,取数据,清除对象)

public class ThreadLocalUtil {
    //提供ThreadLocal对象
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
    //根据key取值,泛型根据调用时需要返回的类型强转
    public static <T> T get(){
        return (T) THREAD_LOCAL.get();
    }
    //存key value
    public static void set(Object value){
        THREAD_LOCAL.set(value);
    }
    //清除,防止内存泄漏
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}

在要存的地方(claims是解析token获得的数据):

//存储数据,可以在别的地方使用
ThreadLocalUtil.set(claims);

在要取得地方直接get就行:

Map<String, Object> user = ThreadLocalUtil.get();

取其中的值(我这里直接取值会多一层,所以需要先get然后将剩下的部分转为String在转为json):

String mapStr = user.get("user").toString();
Map<String, Object> info = (Map<String, Object>) JSON.parse(mapStr);

转json这里用到的alibaba的fastJson,需要在pom文件中引入:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.58</version>
</dependency>

输出打印info:

{"id":1,"username":"Z"}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值