目录
首先创建一个拦截器
一个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"}