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:过滤的请求路径。

3.@WebFilter:作为容器中的过滤器,提供过滤器参数配置。

4.@ServletComponentScan:网上说法,用来扫描@WebFilter注解,使过滤器生效。如果只有少量过滤器,可配置在过滤器类上,不是一定要配置在启动类上的。





猜你喜欢

转载自blog.csdn.net/yzh_1346983557/article/details/79095797