Java: Filter 过滤器
创建一个Filter只需要两步
1. 创建一个类,实现Filter接口
public class MyFilter1 implements Filter {
// 初始化方法 @Override public void init(FilterConfig filterConfig) throws ServletException {
} // 执行过滤的方法 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 过滤请求 System.out.println("MyFiter1在请求到达servlet之前的代码处理"); // 传递过滤器, 跳转到下一个过滤器 filterChain.doFilter(servletRequest,servletResponse); // 过滤响应 System.out.println("myFilter1在响应回到浏览器之前的代码处理"); } //销毁方法 @Override public void destroy() { } }
2. 配置Filter
2.1. 使用xml配置 -> web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> ... <!--配置filter--> <filter> // 用于注册过滤器 <filter-name>MyFilter1</filter-name> <filter-class>com.bjsxt.filter.MyFilter1</filter-class> </filter> <filter-mapping> // 用于设置一个Filter 所负责拦截的资源 <filter-name>MyFilter1</filter-name> <!--通过请求的映射路径匹配拦截的资源--> <url-pattern>/*</url-pattern> // /*=所有的Web资源都需要途径过滤器 </filter-mapping> </web-app>
<filter-name>
用于为过滤器指定一个名字,该元素的内容不能为空。<filter-class>
元素用于指定过滤器的完整的限定类名。
<filter-name>
子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字<url-pattern>
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
2.2. 使用Bean配置
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MyFilter1> registFilter(){ FilterRegistrationBean<MyFilter1> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyFilter1()); registrationBean.addUrlPatterns("/*"); registrationBean.setName("MyFilter1"); registrationBean.setOrder(1); return registrationBean; } }
2.3. 使用注解配置
@Order(1) @WebFilter(filterName = "MyFilter1",urlPatterns = {"/*"}) public class MyFilter1 implements Filter { ... }
添加第二个Filter
public class MyFilter2 implements Filter { // 初始化方法 @Override public void init(FilterConfig filterConfig) throws ServletException { } // 执行过滤的方法 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 过滤请求 System.out.println("MyFilter2在请求到达servlet之前的代码处理"); // 传递过滤器, 跳转到下一个过滤器 filterChain.doFilter(servletRequest,servletResponse); // 过滤响应 System.out.println("myFilter2在响应回到浏览器之前的代码处理"); } //销毁方法 @Override public void destroy() { } }
配置第二个Filter
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> ... <!--配置filter--> <filter> // 用于注册过滤器 <filter-name>MyFilter1</filter-name> <filter-class>com.bjsxt.filter.MyFilter1</filter-class> </filter> <filter> <filter-name>MyFilter2</filter-name> <filter-class>com.bjsxt.filter.MyFilter2</filter-class> </filter> <filter-mapping> // 用于设置一个Filter 所负责拦截的资源 <filter-name>MyFilter1</filter-name> <!--通过请求的映射路径匹配拦截的资源--> <url-pattern>/*</url-pattern> // /*=所有的Web资源都需要途径过滤器 </filter-mapping> <filter-mapping> <filter-name>MyFilter2</filter-name> <!--通过请求的映射路径匹配拦截的资源--> <url-pattern>/*</url-pattern> // /*=所有的Web资源都需要途径过滤器 </filter-mapping> </web-app>
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MyFilter1> registFilter(){ FilterRegistrationBean<MyFilter1> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyFilter1()); registrationBean.addUrlPatterns("/*"); registrationBean.setName("MyFilter1"); registrationBean.setOrder(1); return registrationBean; } @Bean public FilterRegistrationBean<MyFilter2> registFilter2(){ FilterRegistrationBean<MyFilter2> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyFilter2()); registrationBean.addUrlPatterns("/*"); registrationBean.setName("MyFilter2"); registrationBean.setOrder(2); return registrationBean; } }
运行结果:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
filter也可以通过web.xml进行初始化配置
1. 在web.xml中配置Filter的初始化参数
<filter> <filter-name>myfilter2</filter-name> <filter-class>com.bjsxt.filter.MyFilter2</filter-class> <init-param> <param-name>computer</param-name> <param-value>华硕</param-value> </init-param> <init-param> <param-name>RAM</param-name> <param-value>金士顿</param-value> </init-param> </filter>
2. 在Filter中获取初始化参数
public class MyFilter2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyFilter2初始化方法"); String computer = filterConfig.getInitParameter("computer"); String ram = filterConfig.getInitParameter("RAM"); System.out.println("computer:"+computer); System.out.println("RAM:"+ram); } ... }
输出结果
更多可以使用的方法
String getFilterName();//得到filter的名称。 String getInitParameter(String name);//返回定名称的初始化参数的值。如果不存在返回null. Enumeration getInitParameterNames();//返回过滤器的所有初始化参数的名字的枚举集合。 public ServletContext getServletContext();//返回Servlet上下文对象的引用。
实现自动登陆(Filter,session,cookie)
https://segmentfault.com/a/1190000013211245