Servlet中的Filter过滤器的介绍和使用 编写过滤器

转载 2013年12月04日 11:34:09
1、过滤器介绍:

在Servlet规范2.3中定义了过滤器,它能够对Servlet容器的请求和响应对象进行检查和修改。

Servlet过滤器本身并不生成请求和响应对象,只是提供过滤功能。

Servlet过滤器能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容;

Servlet被调用之后检查Response对象,修改Response Header和Response的内容。

Servlet过滤器可以过滤的Web组件包括Servlet,JSP和HTML等文件。

Filter类似于IO中的过滤流,实现也类似于Servlet。

2、Filter接口:

所有的Servlet过滤器都必须实现javax.servlet.Filter接口,并实现该接口中的三个方法:

init(FilterConfig filterConfig)

Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用该方法。该方法将读取web.xml文件中Servlet过滤器的初始化参数。

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。

这里的ServletRequest和ServletResponse一般需要转换成具体的Servlet实现对于的对象,如:HttpServletRequest和HttpServletResponse。

destroy()

Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

public interface Filter
A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. 

Filters perform filtering in the doFilter method. Every Filter has access to a FilterConfig object from which it can obtain its initialization parameters, a reference to the ServletContext which it can use, for example, to load resources needed for filtering tasks.
Filters are configured in the deployment descriptor of a web application
Examples that have been identified for this design are
1) Authentication Filters
2) Logging and Auditing Filters
3) Image conversion Filters
4) Data compression Filters
5) Encryption Filters
6) Tokenizing Filters
7) Filters that trigger resource access events
8) XSL/T filters
9) Mime-type chain Filter
public interface FilterChain
A FilterChain is an object provided by the servlet container to the developer giving a view into the invocation chain of a filtered request for a resource. Filters use the FilterChain to invoke the next filter in the chain, or if the calling filter is the last filter in the chain, to invoke the resource at the end of the chain.
2.1、FilterConfig的使用:

Filter的init方法中提供了一个FilterConfig对象,提供相关的操作:

如获取Filter中配置的初始化参数:
<filter>
      <filter-name>LoginFilter</filter-name>
      <filter-class>com.itzhai.login.LoginFilter</filter-class>
      <init-param>
          <param-name>username</param-name>
          <param-value>arthinking</param-value>
      </init-param>
  </filter>

在init方法中获取:

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    //获取Filter初始化参数
    String username = filterConfig.getInitParameter("username");
}
2.2、在Filter中访问application:
ServletContext context = filterConfig.getServletContext();

也可以在doFilter方法中根据转换好的request获取:

HttpServletRequest req = (HttpServletRequest)request;
ServletContext context = req.getSession().getServletContext();
3、一个简单过滤器的实现:

编写Filter过滤器:

public class LoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init LoginFilter");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //把ServletRequest和ServletResponse转换成真正的类型
        HttpServletRequest req = (HttpServletRequest)request;
        HttpSession session = req.getSession();

        //由于web.xml中设置Filter过滤全部请求,可以排除不需要过滤的url
        String requestURI = req.getRequestURI();
        if(requestURI.endsWith("login.jsp")){
            chain.doFilter(request, response);
            return;
        }

        //判断用户是否登录,进行页面的处理
        if(null == session.getAttribute("user")){
            //未登录用户,重定向到登录页面
            ((HttpServletResponse)response).sendRedirect("login.jsp");
            return;
        } else {
            //已登录用户,允许访问
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        System.out.println("destroy!!!");
    }
}

在web.xml中配置Filter:

<filter>
      <filter-name>LoginFilter</filter-name>
      <filter-class>com.itzhai.login.LoginFilter</filter-class>
  </filter>

  <filter-mapping>
      <filter-name>LoginFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

注意:一般Filter配置在所有的Servlet之前。

4、过滤敏感词汇的Filter简单实现:
@Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //转换成实例的请求和响应对象
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;
        //获取评论并屏蔽关键字
        String comment = req.getParameter("comment");
        comment = comment.replace("A", "***");
        //重新设置参数
        req.setAttribute("comment", comment);
        //继续执行
        chain.doFilter(request, response);
    }
5、Filter的执行顺序

Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。

Servlet中的过滤器(Filter)工作原理

一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servle...
  • pangqiandou
  • pangqiandou
  • 2016-10-29 12:55:37
  • 4585

JavaWeb学习篇之----Servlet过滤器Filter和监听器

一、Servlet过滤器的概念: ***********************************************************************************...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014-04-10 18:41:09
  • 44458

Servlet学习笔记(八):过滤器Filter详解

1、Filter,过滤器,用于在servlet之外对request 和response 进行修改。Filter 有一个 FilterChain 的概念,一个FilterChain 包括多个 Filte...
  • u012228718
  • u012228718
  • 2014-12-09 22:19:58
  • 14204

java servlet过滤器简解及实例

在整个概念中,个人觉得有一篇文章写得不错,通俗易懂,这里就直接套用以上原博文,   一、概念:       Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W...
  • dcb_ripple
  • dcb_ripple
  • 2016-07-20 14:34:08
  • 3580

注解方式过滤器(Filter)不能过滤Servlet的问题

首先出现这个问题的前提是,Servlet使用注解方式。 Filter 和 Servlet 如下:package com.jxust.servlet;@WebServlet("/CartItemServ...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2017-04-14 11:19:43
  • 1132

Servlet3.0-使用注解定义过滤器(Filter)

Servlet3.0提供@WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器组件。 1 2 3 4 5 ...
  • wuxingdepiaoying1991
  • wuxingdepiaoying1991
  • 2014-11-16 16:29:16
  • 3546

Filter 学习(1) 防盗链 Filter。

首先 讲解一下 防盗链的 概念:如果 其他的网站 引用本网站的图片资源 将会显示一个错误图片。只有 本站内的网页引用时,图片才会正常显示。即在 图片显示以前对 request进行验证,看客户的请求 是...
  • itm_hadf
  • itm_hadf
  • 2012-03-24 15:05:48
  • 1961

Servlet学习(五)使用Servlet过滤器实现登录权限校验-附源码下载

使用过滤器来校验用户的登录状态, 在有些情况下,网站的部分网页是需要登录的用户才能访问的,那么该如何实现呢? 其实就是使用过滤器,在逻辑层加上一个过滤器来实现登录状态的校验,然后再将信息跳转到指定的界...
  • icarus_wang
  • icarus_wang
  • 2016-05-16 09:18:57
  • 3408

servlet过滤器Filter入门(转,有自己的例子)

servlet API中最重要的一个功能就是能够为servlet和JSP页面定义过滤器。过滤器提供了某些早期服务器所支持的非标准“servlet链接”的...
  • ipsen2006
  • ipsen2006
  • 2007-08-15 23:47:00
  • 6816

Servlet 过滤器(filter)和Spring 拦截器(Interceptor)区别

转自:http://blog.csdn.net/ggibenben1314/article/details/45341855 一、定义 拦截器 :是在面向切面编程的就是在你的ser...
  • c2223164136
  • c2223164136
  • 2016-04-13 17:58:11
  • 2486
收藏助手
不良信息举报
您举报文章:Servlet中的Filter过滤器的介绍和使用 编写过滤器
举报原因:
原因补充:

(最多只允许输入30个字)