1. 现有问题
- 以往的Servlet中,存在冗余代码,多个Servlet都要进行编写。
2. 概念
-
过滤器(Filter)是处于客户端与服务器目标资源之间的一道技术。
3.过滤器作用
- 执行位于Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter
- 可以解决多个Servlet共性代码的冗余问题
4. 编写过滤器
![](https://img.haomeiwen.com/i16253020/2a184f4f895f4a6c.png)
// TargetServlet.class
package com.qf.filter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/t")
public class TargetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("--Target--");
}
}
//MyFilter.class
package com.qf.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(value = "/t")
public class MyFilter 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("--MyFilter--");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("--End--");
}
@Override
public void destroy() {
}
}
- 上述代码中,MyFilter被部署在了TargetServlet之前实现过滤功能,我们只要是需要看以下返回结果,就能明白他们的执行顺序。
5. 过滤器配置
5.1 注解配置
![](https://img.haomeiwen.com/i16253020/859d24e6cd9bc1d7.png)
5.2 xml配置
![](https://img.haomeiwen.com/i16253020/6b85ea520f42a79a.png)
6. 过滤器链和优先级
6.1 过滤器链
- 客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器,称为一条过滤器链;
- 每个过滤器实现某些特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。
-
在doFilter()方法中,如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有过滤器,如果有,则调用下一个过滤器,如果没有,则调用目标资源。
6.2 过滤器优先级
-
在一个Web应用中,可以开发多个Filter,这些Filter组合起来称为一个Filter链。
网友评论