欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot filter (maven)

程序员文章站 2022-04-23 11:56:11
...

(想直接看使用方式的看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注解,使过滤器生效。如果只有少量过滤器,可配置在过滤器类上,不是一定要配置在启动类上的。