springboot拦截器教程(SpringBoot入门系列十)
springboot拦截器教程(SpringBoot入门系列十)3、重写addInterceptors方法,添加需要的拦截器地址package com.weiz.config; import com.weiz.controller.interceptor.TwoInterceptor; import org.Springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.Interceptorregistry; import com.weiz.controller.interceptor.OneInterceptor; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.ann
前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。
接下来开始讲 Spring Boot的重要功能:整合拦截器。以前我们在做mvc 项目时也使用到的是Filter过滤器也就是拦截器。其实Spring Boot 中的拦截器和SpringMVC中的拦截器也是类似的,只是配置上有些区别。那么下面我们就来看看Spring Boot 是怎么配置拦截器的。
一、拦截器配置
创建Interceptorconfig 拦截器配置类,这个类主要是统一配置管理所有的拦截器。
package com.weiz.config;
import com.weiz.controller.interceptor.TwoInterceptor;
import org.Springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.Interceptorregistry;
import com.weiz.controller.interceptor.OneInterceptor;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Resource
private OneInterceptor myInterceptor1;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加要拦截的url 1 拦截的路径 放行的路径
registry.addInterceptor(myInterceptor1).addPathPatterns("/admin/**").excludePathPatterns("/admin/login");
}
}
说明:
1、使用注解@Configuration配置拦截器
2、继承WebMvcConfigurer 接口
3、重写addInterceptors方法,添加需要的拦截器地址
二、自定义拦截器
前面创建了拦截器的配置管理类,接下来就应该创建具体的拦截器。首先创建com.weiz.controller.interceptor包,并创建OneInterceptor拦截器。这个拦截器通过实现 HandlerInterceptor 接口,达到请求拦截的作用。具体代码如下:
package com.weiz.controller.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class OneInterceptor implements HandlerInterceptor {
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request HttpServletResponse response
Object object) throws Exception {
System.out.println("被OneInterceptor拦截,放行...");return true;
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request HttpServletResponse response
Object object ModelAndView mv)
throws Exception {
// TODO Auto-generated method stub
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行
* (主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request HttpServletResponse response
Object object Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
说明:
1、HandlerInterceptor接口有 3 个拦截方法:
preHandle:Controller逻辑执行之前进行拦截
postHandle:Controller逻辑执行完毕但是视图解析器还未进行解析之前进行拦截
afterCompletion:Controller逻辑和视图解析器执行完毕进行拦截
2、实际开发中 一般preHandle 使用频率比较高,postHandle 和 afterCompletion操作相对比较少。
postHandle 是在视图解析前进行拦截,通过 Model 再次添加数据到 Request域中。
afterCompletion 暂时没有想到使用场景,如果有使用过的场景可以在下面评论区中进行评论。
测试
在浏览器中,输入配置管理器中拦截的地址:http://localhost:8088/th/index
从上图可以看出定义的拦截器生效了,打印出了拦截器里面的log 。
最后
以上,就把Spring Boot 如何使用拦截器介绍完了,是不是特别简单。SpringBoot 2 整合拦截器和整合 Filter的操作很像,都是通过一个注册类将其注入到Spring的上下文中,只不过Filter使用的是 FilterRegistrationBean 而拦截器使用的是 InterceptorRegistry。
个人觉得比使用 xml 配置的方式更为简单,如果你还没有在 SpringBoot 项目中使用过拦截器,赶快来操作一下吧!
这个系列课程的完整源码,也会提供给大家。大家关注我的头条号(章为忠学架构),获取这个系列课程的完整源码。
推荐阅读:
Spring Boot整合定时任务Task,一秒搞定定时任务
SpringBoot入门系列(四)如何整合Thymeleaf模板引擎
Spring Boot集成Redis代码详解,三步搞定!
SpringBoot入门系列(三)资源文件属性配置
Spring Boot入门系列(六)Spring整合Mybatis详解「附详细步骤」