Java Servlet 过滤器
自 2.3 以来,过滤器是 Servlet API 的一部分。与 Servlet 一样,过滤器对象由 Container 实例化和管理,并遵循类似于 Servlet 的生命周期。一个 Servlet 有 4 个阶段,如下图所示
- 实例化。
- 初始化。
- 筛选。
- 破坏。
这些阶段类似于 servlet 的 Instantiate、Initialize、Filter、destroy。过滤器用于预处理请求和后处理响应。过滤器是一个Java对象,它在对资源的请求或来自资源的响应或两者上执行过滤任务。
一些使用过滤器的应用程序
- 验证。
- 日志记录和审计过滤器
- 图像转换过滤器。
- 数据压缩过滤器。
- 加密和解密过滤器。
接口属于过滤器。
- 筛选。
- 过滤器配置。
- 过滤链。
所有这些接口都在javax.Servlet包中可用
筛选
- 过滤器是一个接口。
- 每个过滤器都必须继承自该接口。
- 它提供了生命周期方法
方法
Method | Action performed |
---|---|
init(FilterConfig filterconfig) | Called by the web container to indicate to a filter that it is being placed into service |
doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) | It is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. |
destroy() | to indicate to a filter that is being out of service. |
Note:
- Filter information must be provide inside web.xml .
- Filter is mapped with one or more than one servlet.
文件:web.xml
XML
name
Servlet class name
name
Filter class name
name
/name
name
/url
HTML
TODO supply a title
click here
Java
// Java Program to Illustrate MyBlockFilter
// Importing required classes
import java.io.IOException;
import java.io.PrintWriter;
// Importing all servlet classes
import javax.servlet.*;
// Class
// Implementing Filter class
public class MyBlockFilter implements Filter {
// Method
public void init(FilterConfig config)
throws ServletException
{
}
// Method
public void doFilter(ServletRequest req,
ServletResponse resp,
FilterChain fc)
throws IOException, ServletException
{
String ip = req.getRemoteAddr();
PrintWriter out = resp.getWriter();
if (ip.equals("127.0.0.1")) {
out.print(
",Your ip address is blocked ny this websites
");
}
else {
fc.doFilter(req, resp);
}
}
// Method
public void destroy() {}
}
Java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("Hello Client welcome to my Website...
");
}
}
XML
HelloServlet
HelloServlet
HelloServlet
/servlet1
f1
MyBlockFilter
f1
/servlet1
过滤链
FilterChain 是一个接口,由 servlet 容器实现。过滤器使用 FilterChain 调用链中的下一个过滤器,或者如果调用过滤器是链中的最后一个过滤器,则调用链末端的资源。
方法: doFilter()
导致调用链中的下一个过滤器,或者如果调用过滤器是链中的最后一个过滤器,则导致调用链末尾的资源。
返回类型:无效
参数:
- HttpServletRequest 请求
- HttpServletResponse 响应
句法:
void doFilter(HttpServletRequest request, HttpServletResponse response)
我们可以开发三种类型的过滤器,如下所示:
(1) 请求过滤器:仅包含请求前处理逻辑。
示例:请求计数过滤器、身份验证过滤器、授权过滤器、验证过滤器等。
(2) 响应过滤器:仅包含响应后生成逻辑。
示例:转换过滤器、压缩过滤器等。
(3) 请求-响应过滤器:包含请求前和响应后生成逻辑。
示例:性能测试过滤器。
实现:过滤器示例
A.文件: 索引.html
HTML
TODO supply a title
click here
B.文件:MyBlockFilter。Java
Java
// Java Program to Illustrate MyBlockFilter
// Importing required classes
import java.io.IOException;
import java.io.PrintWriter;
// Importing all servlet classes
import javax.servlet.*;
// Class
// Implementing Filter class
public class MyBlockFilter implements Filter {
// Method
public void init(FilterConfig config)
throws ServletException
{
}
// Method
public void doFilter(ServletRequest req,
ServletResponse resp,
FilterChain fc)
throws IOException, ServletException
{
String ip = req.getRemoteAddr();
PrintWriter out = resp.getWriter();
if (ip.equals("127.0.0.1")) {
out.print(
",Your ip address is blocked ny this websites
");
}
else {
fc.doFilter(req, resp);
}
}
// Method
public void destroy() {}
}
C.文件:HelloServlet
Java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("Hello Client welcome to my Website...
");
}
}
D.文件:web.xml
XML
HelloServlet
HelloServlet
HelloServlet
/servlet1
f1
MyBlockFilter
f1
/servlet1
输出:如果我们的PC IP地址是“ 127.0.0.1” ,我们就不能访问这个网站