spring boot filter (maven)
(想直接看使用方式的看4.)今天想要完成一个功能:在请求404时,获取请求url。一开始想在controller控制层获取,发现不行,又想到Interceptor拦截器中获取,发现还是获取不到,2中方式从request中得到的都已经是spring boot默认处理后的路径,即http://127.0.0.1:8080/项目名/error这种路径,并不是真实请求的路径,所以到网上查了一下,发现解决办法:使用filter过滤器。那么为什么过滤器就可以获取到而拦截器得不到呢?我就产生了这个疑问,下面是我个人的简单理解。
1.filter:过滤器,生命周期:HttpRequest ----> Filter ----> Servlet ----> Controller/Action/... ----> Filter ----> HttpResponse
2.interceptor:拦截器,生命周期: HttpRequest ----> DispactherServlet ----> HandlerInterceptor ---->Controller----> HandlerInterceptor ----> HttpResponse
3.总结:Filter和Interceptor的执行顺序,过滤前-servlet-拦截前-控制层执行-拦截后-过滤后,拦截器得到的已经是servlet即springmvc的DispactherServlet 处理后的request,在404的时候,DispactherServlet 已经将请求转到默认的/error路径,所以拦截器是获取不到原来的请求url了,而过滤器可以得到。
4.filter在spring boot中的使用:
(1)自定义过滤器类
@Component
@WebFilter(filterName = "requestFilter",urlPatterns = "/*")
public class RequestFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
(2)启动类中添加扫描注解
@ServletComponentScan
public class AppConfig {
}
备注:1.filterName建议使用类名,首字母小写。原因:filterName的值需要和@Component中的值即容器中bean名一致,否则,会创建2个过滤器,执行2次doFilter()!而@Component值即容器中bean名默认为类名,首字母小写。当然,你可以手动书写@Component的value,只要保证filterName的值和@Component的value一致就ok了。且一定要配置filterName,因为filterName默认不是首字母小写的类名。
2.urlPatterns:过滤的请求路径。
[email protected]:作为容器中的过滤器,提供过滤器参数配置。
[email protected]:网上说法,用来扫描@WebFilter注解,使过滤器生效。如果只有少量过滤器,可配置在过滤器类上,不是一定要配置在启动类上的。
下一篇: 抖音关闭单身开启恋爱模式拍摄教程
推荐阅读
-
Spring Boot项目实战之拦截器与过滤器
-
spring boot tomcat jdbc pool的属性绑定
-
spring boot整合mybatis+mybatis-plus的示例代码
-
spring boot 使用Aop通知打印控制器请求报文和返回报文问题
-
spring boot 打jar包,获取resource路径下的文件
-
Spring Boot入门HelloWorld程序
-
开发一个Spring Boot Starter!
-
Spring Boot 2.X整合Spring-cache(让你的网站速度飞起来)
-
SpringBoot 源码解析 (七)----- Spring Boot的核心能力 - SpringBoot如何实现SpringMvc的?
-
SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)