`
forlab
  • 浏览: 129046 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Web笔记 – Servlet中的Filter过滤器的介绍和使用 编写过滤器

 
阅读更多
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之前。

分享到:
评论

相关推荐

    过滤器笔记整理

    Filter类似于servlet 由servlet容器来启动。并且只实例一次,在实例化的时候会调用它的init方法 Filter 技术使用户可以改变一个request和修改一个response。 Filter 不是一个servlet,它能够在一个request到达...

    JAVAWeb全课程笔记( html版)

    目录 ...CSS总结 JavaScript总结 DOM总结 tomcat服务器 ...Servlet Filter 过滤器 HTTP 协议 文件上传和下载 Servlet事件监听器 JavaMail开发 (案例)Estore电子商城 软件国际化 Java基础加强 JQuery Ajax JSON

    javaWed笔记

    &lt;filter-mapping&gt;元素中有一个特殊的子元素,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,元素的值共有4个,具体如下: 1)REQUEST 当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是...

    过滤器学习笔记一(Filter教你快速入门)

    过滤器一:过滤器概述1.什么是过滤器二:过滤器详细1.过滤器的四种拦截方式三:过滤器的应用场景1.案例一:分IP统计访问次数2.案例二:粗粒度权限管理3.案例三:全站编码问题4.案例四:页面静态化(图书管理小项目)...

    web开发课程笔记、源码和课程视频.zip

    web开发课程笔记、源码和课程视频,适合自学web、有编程基础...内含:html、css、javascript、jQuery、XML、Tomcat、Servlet、jsp、EL表达式、JSTL标签库、cookie、session、Filter过滤器、json、Ajax请求、项目实战。

    javaweb详细笔记,绝对详细(内含代码)

    javaweb ...知识点 Javascript知识点 jQuery知识点 14 Bootstrap知识点 17 JDBC & 配置文件 & 连接池 19 Xml文档及解析 31 反射 33 Http协议和Tomcat服务器 36 JavaWeb核心之Servlet 41 ...过滤器Filter

    JavaWeb笔记.pdf

    关于java写后台,实现动态页面,tomcat,maven的使用,简单介绍了监听器,过滤器listener,filter,简单实现了,对于JSP则不过多记录

    我的JavaWeb笔记整理

    tomcat、xml、servlet、jsp、listener监听器、EL、JSTL、Cookie、Session、Filter过滤器、JSON、AJAX、i18n、文件上传下载

    简易学习社交平台

    利用丰富的文章内容吸引用户注册登录评论文章,对于用户的请求,后台service业务层都有相对应的curd功能为用户提供服务,后台servlet逻辑层控制整个web应用的页面逻辑跳转功能,Filter过滤器过滤掉没有用户信息的...

    Struts课堂笔记.rar--struts2的struts.properties配置文件详解

    是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中 struts.serve.static Whether the Struts filter should serve static content or not 是否struts过滤器应该提供静态内容 struts.tag....

Global site tag (gtag.js) - Google Analytics