Filter概述:
- 概念:Filter是servlet2.3后增加的功能,运行在服务器端的程序,先与之相关的servlet或jsp页面之前运行。
- 作用:过滤请求和相应
- 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
- 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
- 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
- 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
- 应用场景:自动登录;统一编码;过滤一些特殊符号或敏感词
Filter的生命周期:
- 在项目启动的时候, 服务器创建Filter的对象,调用 init() 方法实现初始化操作。
- 每当请求来的时候,服务器获取一个线程,执行 doFilter() 方法,实现过滤的逻辑。
- 当服务器移除Filter的时候或者服务器正常关闭的时候,服务器调用 destroy() 方法,实现销毁操作。
下面代码来说明Filter的生命周期和执行过程。
/* 自定义过滤器 */ public class TestFilter implements Filter { /* 初始化 */ @Override public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { System.out.println("Filter已初始化"); } /* 执行过滤的方法 */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("执行Request过滤"); // 放行 filterChain.doFilter(servletRequest, servletResponse); System.out.println("执行Response过滤"); } /* 销毁 */ @Override public void destroy() { System.out.println("Filter已销毁"); } }
/* controller层中访问servlet */ @POST @Path("httpfilter") public String httpFilterTest(String str) { System.out.println("正在访问servlet..."); return str; }
程序运行结果:
初始化
可以看出,Filter对象的初始化是在项目启动的时候进行的。执行过滤的方法
可以看出,ServletResquest访问servlet和ServletResponse返回前端都会经过过滤器。销毁
在服务器正常关闭的时候,服务器调用 destroy() 方法,实现销毁操作。
过滤器在SpringBoot中的使用
1、定义一个过滤器,实现Filter接口并重写Filter接口的三个方法。
public class TestFilter implements Filter { @Override public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; String str = httpServletRequest.getHeader("user-type"); if(str!=null && str.equals("vip")){ filterChain.doFilter(httpServletRequest, httpServletResponse); } } @Override public void destroy() { } }
2、注册过滤器
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean filterRegistration() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new TestFilter()); registrationBean.addUrlPatterns("/rest/filter/*"); registrationBean.setName("testFilter"); registrationBean.setOrder(1); return registrationBean; } }
本例中,对于所有 “/rest/filter/*” 的请求,在访问servlet之前必须要经过过滤器的认可。如果请求头中 “user-type” 的值是 “vip” ,则过滤器会放行,调用 filterChain.doFilter() 方法;否则不会调用 filterChain.doFilter() 放行,永远也访问不到servlet服务器。
当使用多个过滤器时,可以通过 registrationBean.setOrder() 方法来设置过滤器的优先级,方法中参数值越小,优先级越高。