什么是过滤器
1 过滤器简介
Filter(过滤器)是对Web资源进行拦截的对象。
通常在过滤器做一些逻辑处理后再交给下一个过滤器或Servlet处理,过滤器一般是用来拦截请求进行处理的,也可以对返回的响应进行拦截处理。
过滤器主要用于执行过滤任务,例如编码转换,日志记录,压缩,加密和解密,输入验证等。
过滤器是可插拔的,即在web.xml文件中定义的,如果我们删除web.xml文件中相应配置,过滤器会被自动删除,我们并不需要改变的Servlet。因此维护成本将更少。
2 过滤器的应用场景
- 记录所有传入的请求
- 记录发出请求的计算机的IP地址
- 字符编码转换
- 数据压缩
- 加密和解密
- 输入验证等
3 过滤器的好处
- 过滤器是可插拔的,非常灵活。
- 一个过滤器不依赖于另一种资源。
- 维护成本低
4 过滤器的API
Filter(过滤器)一样有自己的API。javax.servlet包含Filter API的三个接口。
- Filter
- FilterChain
- FilterConfig
4.1 Filter接口
要创建任何过滤器,必须实现Filter接口。Filter接口提供了Filter的生命周期方法。
方法名称 | 说明 |
---|---|
public void init(FilterConfig config) | init()方法仅被调用一次。用于初始化过滤器。 |
public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain) | 每当用户请求过滤器拦截到的任何资源时,都会调用doFilter()方法,该方法用于执行过滤任务。 |
public void destroy() | 当从服务中删除过滤器时,仅调用一次。 |
4.2 FilterChain接口
FilterChainf接口负责调用链中的下一个过滤器或资源。此对象在Filter接口的doFilter方法中传递,FilterChain接口仅包含一个方法:
- public void doFilter(HttpServletRequest request,HttpServletResponse response):它将控件传递给下一个过滤器或资源。
5 定义过滤器的语法
接着,让我们看一下如何定义Filter过滤器,主要使用filter和filter-mapping标签:
<web-app>
<filter>
<filter-name>...</filter-name>
<filter-class>...</filter-class>
</filter>
<filter-mapping>
<filter-name>...</filter-name>
<url-pattern>...</url-pattern>
</filter-mapping>
</web-app>
对于映射过滤器,我们可以使用url-pattern或servlet-name。url-pattern元素比servlet-name元素更有优势,可以应用于Servlet,JSP或HTML。
6 过滤器的案例
6.1 编写页面
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>一点教程网-过滤器案例</title>
<meta http-equiv="content-type" content="text/html" charset="UTF-8">
</head>
<body>
<a href="servlet1">点击这里</a>
</body>
</html>
6.2 编写需要拦截的Servlet
TargetServlet:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class TargetServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
res.setContentType("text/html;charset=utf-8");
PrintWriter out = res.getWriter();
out.print("<br/>这是需要拦截的Servlet资源<br/>");
}
}
6.3 编写Filter过滤器
MyFilter:
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
/**
*一点教程网 - http://www.yiidian.com
*/
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
out.print("在目标资源之前");
chain.doFilter(req, resp);//请求下一个资源(可能是下一个拦截器,也可能是Servlet等资源)
out.print("在目标资源之前后");
}
public void destroy() {
}
}
6.4 配置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">
<servlet>
<servlet-name>TargetServlet</servlet-name>
<servlet-class>TargetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetServlet</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/servlet1</url-pattern>
</filter-mapping>
</web-app>
6.5 运行测试
访问index.jsp,http://localhost:8080/
然后点击,看到以下效果,代表过滤器已经生效啦。
热门文章
优秀文章