从Authorization获取token,进而获取用户信息(拦截器的使用)

本文介绍了如何在SpringMVC应用中使用HandlerInterceptor和WebMvcConfigurer拦截器,通过JWT验证token并在请求处理前后操作中获取和清理用户信息,避免在非登录/注册路径下进行认证。
摘要由CSDN通过智能技术生成

目录

一、创建一个类实现HandlerInterceptor

二、创建一个类实现WebMvcConfigurer


首先,我大致讲讲是怎么样一个应用场景。

我通过JWT生成用户token,ThreadLocal来保存用户信息。我想在除了登录和注册的时候,获取用户信息。

下面来讲讲如何使用。

拦截器的使用,大致分两步。

1.创建一个类实现HandlerInterceptor,定义拦截内容

2.创建一个类实现WebMvcConfigurer,添加拦截对象和地址

一、创建一个类实现HandlerInterceptor

实现后,会有三个方法可以重写,分别是preHandle(调用前执行),postHandle(调用后执行),afterCompletion(完成后执行)。这边我们只使用preHandle和afterCompletion

package com.yjzx.interceptors;

import com.yjzx.pojo.Result;
import com.yjzx.utils.JwtUtil;
import com.yjzx.utils.ThreadLocalUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

//拦截器统一认证
//token
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //令牌验证
        String token=request.getHeader("Authorization");
        System.out.println(token);
        try{
            Map<String, Object> claims = JwtUtil.parseToken(token);

            //把业务数据存储到ThreadLocal中
            ThreadLocalUtil.set(claims);
            //放行
            return true;
        }catch (Exception e){
            //http响应状态码为401
            response.setStatus(401);
            //不放行
            return false;
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //清空ThreadLocal中的数据
        ThreadLocalUtil.remove();
    }
}

注意,要添加@Component注解,表示受Spring容器控制

二、创建一个类实现WebMvcConfigurer

这边我们重写addInterceptors,其他的挺多的,这边不细说了

添加我们刚创建的拦截器

package com.yjzx.config;

import com.yjzx.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//将拦截器注入
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //登录注册不拦截
        registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
    }
}

注意,需要添加@Configuration注解

即可使用

当然,实现WebMvcConfigurer是简化的,有兴趣的话可以去下面参考的找一下另外一个

这边我也用了JwtUtil和ThreadLoadUtil,我把代码附上,方便使用

package com.yjzx.utils;

public class ThreadLocalUtil {
    //提供ThreadLocal对象
    private static final ThreadLocal THREAD_LOCAL=new ThreadLocal();

    //根据键获取值
    public static <T>T get(){
        return (T) THREAD_LOCAL.get();
    }

    //存储键值对
    public static void set(Object value){
        THREAD_LOCAL.set(value);
    }

    //清除ThreadLocal 防止内存泄露
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}
package com.yjzx.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

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

public class JwtUtil {

    private static final String KEY="yjxz";//final常与static连用,作为类常量使用,一旦赋值不能更改

    //接受业务数据
    public static String genToken(Map<String,Object> claims){
        return JWT.create()
                .withClaim("claims",claims)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))
                .sign(Algorithm.HMAC256(KEY));
    }

    //接受token,验证token,并返回业务数据
    public static Map<String,Object> parseToken(String token){
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }
}

参考https://wenku.baidu.com/view/20a085041a2e453610661ed9ad51f01dc28157fc.html?_wkts_=1705220585096&bdQuery=java%E6%8B%A6%E6%88%AA%E5%99%A8

注:学习内容,如有不足,欢迎补充

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篆愁君的烦恼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值