创建一个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)