大家好,又见面了,我是你们的朋友全栈君。
前言
上篇文章,我们已经在 SpringBoot 中整合了 JWT 并实现了 Token 验证,那我们在实际应用中就会发现,如果每个 视图层(controller)都手动验证 token,代码就会显得特别臃肿,本篇文章主要为了解决该问题。
如果对整合 JWT 还不熟悉的朋友,可以先看看我的这篇博客:【SpringBoot】四十四、SpringBoot中整合JWT实现Token验证(整合篇)
自定义注解
1、创建自定义注解
package com.asurplus.common.annotation;
import java.lang.annotation.*;
/**
* 自定义注解 验证 token
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface JwtToken {
}
我们创建了一个名为 JwtToken 的注解,它没有任何参数,解释一下注解上面的一些注解:
- @Target(ElementType.METHOD),Target 说明了 Annotation 所修饰的对象范围,METHOD 用于描述方法
- @Retention(RetentionPolicy.RUNTIME),运行时注解,注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
- @Documented,元注解,表明这个注解应该被 javadoc 工具记录
2、拦截器
package com.asurplus.common.config;
import com.asurplus.common.jwt.JwtUtil;
import com.asurplus.common.utils.ResponseResult;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class JwtTokenInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
JwtToken annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(JwtToken.class);
} else {
return true;
}
// 如果没有该注解,直接放行
if (annotation == null) {
return true;
}
// 验证token
ResponseResult res = JwtUtil.verity();
if (200 == res.getCode()) {
return true;
}
// 验证不通过,返回401,表示用户未登录
response.setStatus(401);
return false;
}
}
3、注解拦截器
package com.asurplus.common.config;
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 WebMvcConfig implements WebMvcConfigurer {
@Autowired
private JwtTokenInterceptor authorizationInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**");
}
}
我们拦截了所有以 api 开头的请求路径,如果带有 @JwtToken 注解都会验证 token 信息,从而实现自定义注解验证 token
如您在阅读中发现不足,欢迎留言!!!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129630.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...