过滤器
过滤器(Filter)是向 Web 应用程序的请求和响应处理添加功能的Web服务组件
过滤器的工作原理:

过滤器生命周期
过滤器生命周期的各个阶段:
HelloFilter |
---|
| @WebFilter("/*")
public class HelloFilter extends HttpFilter implements Filter {
public HelloFilter() {
super();
}
public void init(FilterConfig fConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
public void destroy() {
}
}
|
源代码
HelloFilter |
---|
| import java.io.IOException;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
@WebFilter("/*")
public class HelloFilter extends HttpFilter implements Filter {
public HelloFilter() {
super();
}
public void init(FilterConfig fConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
public void destroy() {
}
}
|
过滤器定义
创建Filter分两步:
创建Filter类
SimpleFilter1 |
---|
| @WebFilter("/*")
public class SimpleFilter2 extends HttpFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.append("<p style='color: red;'>SimpleFilter2检查中...</p>");
chain.doFilter(request, response);
out.append("<p style='color: red;'>SimpleFilter2检查完成!</p>");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
|
源代码
SimpleFilter1 |
---|
| import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
public class SimpleFilter1 extends HttpFilter implements Filter {
private FilterConfig filterConfig;
public SimpleFilter1() {
super();
}
public void init(FilterConfig fConfig) throws ServletException {
this.filterConfig = fConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.append("<p style='color: blue;'>SimpleFilter1检查中...</p>");
chain.doFilter(request, response);
out.append("<p style='color: red;'>SimpleFilter1检查中完成!</p>");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void destroy() {
}
}
|
URL映射
Filter有两种映射方式:注解、web.xml
过滤器链
FilterChain 接口用于调用过滤器链中的一系列过滤器

示例
创建一个Servlet(DoSomethingServlet
)接收客户端语法,创建一个客户端页面(hi_filter.html
)发送Servlet请求,创建两个过滤器(SimpleFilter1
,SimpleFilter2
)监听全部URL请求
DoSomethingServlet |
---|
| @WebServlet("/DoSomthing")
public class DoSomethingServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<p style='color:green;'>我做了一些事!<p>");
}
}
|
源代码
DoSomethingServlet |
---|
| import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/DoSomthing")
public class DoSomethingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DoSomethingServlet() {
super();
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<p style='color:green;'>我做了一些事!<p>");
}
}
|
demo/HelloFilter/src/main/webapp/hi_filter.html |
---|
| <html>
<head>
<meta charset="utf-8">
<title> 新文档 </title>
</head>
<body>
<h1>欢迎使用第一个过滤器示例</h1>
<a href="/HelloFilter/DoSomthing">单击此处查看过滤器的效果</a>
</body>
</html>
|
SimpleFilter1 |
---|
| public class SimpleFilter1 extends HttpFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.append("<p style='color: blue;'>SimpleFilter1检查中...</p>");
chain.doFilter(request, response);
out.append("<p style='color: red;'>SimpleFilter1检查中完成!</p>");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
|
源代码
SimpleFilter1 |
---|
| import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
public class SimpleFilter1 extends HttpFilter implements Filter {
private FilterConfig filterConfig;
public SimpleFilter1() {
super();
}
public void init(FilterConfig fConfig) throws ServletException {
this.filterConfig = fConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.append("<p style='color: blue;'>SimpleFilter1检查中...</p>");
chain.doFilter(request, response);
out.append("<p style='color: red;'>SimpleFilter1检查中完成!</p>");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void destroy() {
}
}
|
SimpleFilter2 |
---|
| @WebFilter("/*")
public class SimpleFilter2 extends HttpFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.append("<p style='color: red;'>SimpleFilter2检查中...</p>");
chain.doFilter(request, response);
out.append("<p style='color: red;'>SimpleFilter2检查完成!</p>");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
|
源代码
SimpleFilter2 |
---|
| import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
@WebFilter("/*")
public class SimpleFilter2 extends HttpFilter implements Filter {
private FilterConfig filterConfig;
public SimpleFilter2() {
super();
}
public void init(FilterConfig fConfig) throws ServletException {
this.filterConfig = fConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.append("<p style='color: red;'>SimpleFilter2检查中...</p>");
chain.doFilter(request, response);
out.append("<p style='color: red;'>SimpleFilter2检查完成!</p>");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void destroy() {
}
}
|