Servlet过滤器基本介绍和用法

  1. 过滤
  2. 过滤器的用法
  3. 过滤器的优势
  4. API过滤器
    1. 筛选接口
    2. FilterChain接口
    3. FilterConfig接口
  5. 过滤器的简单示例
过滤器是在请求的预处理和后处理中调用的对象。
它主要用于执行过滤任务, 例如转换, 日志记录, 压缩, 加密和解密, 输入验证等。
【Servlet过滤器基本介绍和用法】Servlet过滤器是可插入的, 即在web.xml文件中定义了它的条目, 如果我们从web.xml文件中删除了filter的条目, 则过滤器将被自动删除, 我们不需要更改servlet。
因此维护成本会更少。
Servlet过滤器基本介绍和用法

文章图片
注意:与Servlet不同, 一个过滤器不依赖于另一个过滤器。 过滤器的用法
  • 记录所有传入的请求
  • 记录发出请求的计算机的IP地址
  • 转换
  • 资料压缩
  • 加密和解密
  • 输入验证等
过滤器的优势
  1. 过滤器可插拔。
  2. 一个过滤器不依赖于另一种资源。
  3. 减少维护
API过滤器
像servlet过滤器一样有自己的API。 javax.servlet包包含Filter API的三个接口。
  1. 过滤
  2. 过滤链
  3. FilterConfig
1)过滤接口
要创建任何过滤器, 必须实现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接口仅包含一个方法:
  1. public void doFilter(HttpServletRequest request, HttpServletResponse response):它将控件传递给下一个过滤器或资源。
如何定义过滤器
我们可以定义与servlet相同的过滤器。让我们看一下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。
过滤器的简单示例
在此示例中, 我们仅显示在请求的后处理之后自动调用过滤器的信息。
index.html
< a href="http://www.srcmini.com/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
为了定义过滤器, 必须像servlet一样定义web-app的filter元素。
< 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>

下载此示例(使用Myeclipse IDE开发)
下载此示例(使用Eclipse IDE开发)
下载此示例(使用Netbeans IDE开发)

    推荐阅读