Java Servlet教程—Servlet过滤器
Servlet过滤器
过滤器是一个对象,它在请求的预处理和后处理时被调用。
它主要用于执行过滤任务,如转换、日志记录、压缩、加密和解密、输入验证等。
Servlet过滤器是可插拔的,即它的条目在web.xml文件中定义,如果我们从web.xml文件中删除过滤器的条目,过滤器将自动被移除,我们不需要更改servlet。
因此,维护成本会降低。
注意:与Servlet不同,一个过滤器不依赖于另一个过滤器。
过滤器的用途
- 记录所有传入的请求
- 记录请求来源计算机的IP地址
- 转换
- 数据压缩
- 加密和解密
- 输入验证等。
过滤器的优点
- 过滤器是可插拔的。
- 一个过滤器不依赖于另一个资源。
- 维护成本低
过滤器API
像servlet一样,过滤器也有自己的API。javax.servlet包包含了Filter API的三个接口。
- Filter
- FilterChain
- FilterConfig
1) Filter接口
要创建任何过滤器,您必须实现Filter接口。Filter接口为过滤器提供了生命周期方法。
方法 | 描述 |
---|---|
public void init(FilterConfig config) | init()方法只被调用一次。它用于初始化过滤器。 |
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) | 每次用户请求映射到该过滤器的任何资源时,都会调用doFilter()方法。它用于执行过滤任务。 |
public void destroy() | 当过滤器退出服务时,只会调用一次此方法。 |
2) FilterChain接口
FilterChain对象负责调用链中的下一个过滤器或资源。这个对象在Filter接口的doFilter方法中传递。FilterChain接口只包含一个方法:
- public void doFilter(HttpServletRequest request, HttpServletResponse response): 它将控制权传递给下一个过滤器或资源。
如何定义过滤器
我们可以像定义servlet一样定义过滤器。让我们看看过滤器和过滤器映射的元素。
<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。
过滤器的简单示例
在这个示例中,我们只是显示信息,表明过滤器在请求的后处理之后自动被调用。
index.html
<a href="servlet1">click here</a>
MyFilter.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
public class MyFilter implements Filter{
public void init(FilterConfig arg0) throws ServletException {}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
PrintWriter out=resp.getWriter();
out.print("filter is invoked before");
chain.doFilter(req, resp);//sends request to next resource
out.print("filter is invoked after");
}
public void destroy() {}
}
HelloServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
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("<br>welcome to servlet<br>");
}
}
web.xml
为了定义过滤器,web-app的filter元素必须像servlet一样定义。
<web-app>
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<filter>
<filter-name>f1</filter-name>
<filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>f1</filter-name>
<url-pattern>/servlet1</url-pattern>
</filter-mapping>
</web-app>