上一篇介绍了springboot结合redis的使用案例,这篇主要介绍springboot实现自定义拦截器配合注解使用,很有用的一篇文章哦。
环境准备:
jdk 8
IDEA
maven 3.3.9
项目搭建:
目录结构:
**案例场景:**现在我需要对部分用户进行拦截,通过注解的方式,假如有这么一个注解@tokenAuth,只要他放在方法上,那么请求都不需要带token,假如没有请求没有带token,那么请求方法将会失败。
第一步:编写拦截器
@Component
public class TokenInterceptor extends HandlerInterceptorAdapter {
public TokenInterceptor() {
super();
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 免token注解
IgnoreAuth ignoreAuth;
//1: 判断是否方法级别的
if(handler instanceof HandlerMethod) {
ignoreAuth = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
// 如果不是方法级别的
return true;
}
if(ignoreAuth != null){
// 有注解,则不验证token
return true;
}
//2:header中拿token
String token = request.getHeader("token");
if(StringUtils.isBlank(token)){
// 没有从request中拿
token = request.getParameter("token");
}
//3:token为空
if(StringUtils.isBlank(token)){
System.out.println("token 为空,无法通过拦截器");
return false;
}
//下面两步省略,自己可以创建一个简单用户表,然后里面设置token 信息
//4:查询token信息 没查到抛出token无效信息
//5:设置userId到request里,后续根据userId,获取用户信息
//return true表示通过了拦截器 可以执行下面的操作
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
super.afterConcurrentHandlingStarted(request, response, handler);
}
}
第二步:编写配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
//将tokenInterceptor放入到spring容器中管理
@Autowired
public TokenInterceptor tokenInterceptor;
/*实现此方法添加拦截器
* addPathPatterns 拦截路径
* excludePathPatterns() (不拦截的路径数组) 我这个demo没有使用
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截路径,表示此路径下的所有地址都会先执行此拦截器,通过之后才能访问Controller
String[] addPathPatterns = {
"/token/*"
};
registry.addInterceptor(tokenInterceptor).addPathPatterns(addPathPatterns);
}
}
第三步:编写注解类
/*
表明这个注解应该被 javadoc工具记录
@Documented
作用于方法级别
@Target(ElementType.METHOD)
这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
@Retention(RetentionPolicy.RUNTIME)
* */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreAuth {
}
第四步:编写controller类
@RestController
@RequestMapping("/token")
public class Controller {
@RequestMapping("/interceptor")
public String testInterceptor(){
return "恭喜你通过了拦截器来到了这里";
}
}
测试如下:
一:不带token
localhost:8080/token/interceptor
执行结果:
token 为空,无法通过拦截器
二:带token
localhost:8080/token/interceptor?token=coldStone
执行结果:
恭喜你通过了拦截器来到了这里,我的微信公众号是coldStone
这样我们便成功的通过拦截器里的方法去判断用户请求是否带token,而做出相应的响应。
源码地址:spring-boot-web
上一篇:springboot结合redis实现缓存
、
如果有小伙伴觉得我写的不错的话可以关注一下我的博客,我会一直持续更新,也可以支持一下我的公众号哦:java架构师小密圈,会分享架构师所必须深入研究的技术,比如netty,分布式,性能优化,spring源码分析,mybatis源码分析,等等等,同时还会分享一些赚钱理财的小套路哦,欢迎大家来支持,一起学习成长,程序员不仅仅是搬瓦工!
公众号:分享系列好文章