Filter
用于对用户请求进行预处理或者对响应进行后处理,是个典型的处理链
Filter与Servlet的区别
Filter不能直接向用户生成响应。
完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
Filter的创建
- 建Filter处理类
- web.xml文件中配置Filter
在web.xml配置Filter
init-param元素:为该Filter配置初始化参数,这里设置的初始值会封装在Filter的init()方法的FilterConfig参数中。
- param-name子元素:指定参数名。
- param-value子元素:指定参数值。
filter-mapping的在web.xml中的顺序决定Filter的过滤顺序。
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_3_1.xsd"
version="3.1">
<filter>
<filter-name>AFilter</filter-name>
<filter-class>test.AFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>AFilter</param-value>
</init-param>
</filter>
<filter>
<filter-name>BFilter</filter-name>
<filter-class>test.BFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>BFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>test.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
MyServlet.java
public class MyServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getAttribute("name")+"write in MyServlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
AFilter.java
public class AFilter implements Filter{
private FilterConfig config=null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("AFilter initing");
this.config=filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("before invoke AFilter's chain.doFilter() ");
HttpServletRequest HservletRequest=(HttpServletRequest)servletRequest;
servletRequest.setAttribute("name",config.getInitParameter("name"));
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("after invoke AFilter's chain.doFilter() ");
}
@Override
public void destroy() {
this.config=null;
System.out.println("AFilter destroy");
}
}
BFilter.java
public class BFilter implements Filter{
private FilterConfig config=null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("BFilter initing");
this.config=filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("before invoke BFilter's chain.doFilter() ");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("after invoke BFilter's chain.doFilter() ");
}
@Override
public void destroy() {
this.config=null;
System.out.println("BFilter destroy");
}
}
访问该Servlet,在控制台的输出
//Filter在WEB应用加载时就进行了初始化,两个Filter的初始化顺序如下
BFilter initing
AFilter initing
//访问Serlvet时的,过滤顺序如下
before invoke BFilter's chain.doFilter()
before invoke AFilter's chain.doFilter()
AFilterwrite in MyServlet
after invoke AFilter's chain.doFilter()
after invoke BFilter's chain.doFilter()
//卸载WEB应用时,Filter的销毁顺序
BFilter destroy
AFilter destroy