zoukankan      html  css  js  c++  java
  • Java过滤器Filter使用详解

    转自:http://www.cnblogs.com/ygj0930/p/6374212.html

    过滤器

       过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

          如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

         在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:

         

         过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。

         下面是过滤器的简单应用:

        1:创建过滤器

        

        如图,新建一个class,实现接口Filter(注意:是javax.servlet中的Filter)。

        2:重写过滤器的doFilter(request,response,chain)方法。另外两个init()、destroy()方法一般不需要重写。在doFilter方法中进行过滤操作。

        常用代码有:获取请求、获取响应、获取session、放行。

        剩下的代码就是根据session的属性进行过滤操作、设置编码格式等等了,看情况而定。

    复制代码
    HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象
    HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象
    HttpSession session=request.getSession();//获取session对象

    过滤操作代码......

    chain.doFilter(request, response);//放行,通过了当前过滤器,递交给下一个filter进行过滤
    复制代码

        3:在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

    复制代码
    <filter>  
        <filter-name>loginFilter</filter-name>//过滤器名称  
        <filter-class>com.ygj.control.loginFilter</filter-class>//过滤器类的包路径
    <init—param> //可选 
        <param—name>参数名</param-name>//过滤器初始化参数
        <param-value>参数值</param-value>  
    </init—pamm>  
    </filter> 
    <filter-mapping>//过滤器映射 <filter-name>loginFilter</filter-name> <url—pattern>指定过滤器作用的对象</url-pattern>
    复制代码

        在配置中需要注意的有两处:一是<filter-class>指明过滤器类所在的包路径。二是<url-pattren>处定义过滤器作用的对象。一般有以下规则:

        1:作用与所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。

        2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>

        3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。

        4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>

    <filter>指定一个过滤器。
    <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
    <filter-class>元素用于指定过滤器的完整的限定类名。
    <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
    在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
    <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
    <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
    <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
    <servlet-name>指定过滤器所拦截的Servlet名称。
    <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
    <dispatcher>子元素可以设置的值及其意义
    REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
    INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

        如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。

    复制代码
       <filter>
          <filter-name>loginFilter</filter-name>
          <filter-class>com.ygj.control.loginFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>loginFilter</filter-name>
          <url-pattern>*.jsp</url-pattern>
      </filter-mapping>
      <filter-mapping>
          <filter-name>loginFilter</filter-name>
          <url-pattern>*.do</url-pattern>
      </filter-mapping>
    复制代码

        例1:用过滤器实现登录验证,没登录则驳回访问请求并重定向到登录页面。

    复制代码
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
                FilterChain arg2) throws IOException, ServletException {
            
            HttpServletRequest request=(HttpServletRequest) arg0;
            HttpServletResponse response=(HttpServletResponse) arg1;
            HttpSession session=request.getSession();
            
            String path=request.getRequestURI();
            
            Integer uid=(Integer)session.getAttribute("userid");
            
            if(path.indexOf("/login.jsp")>-1){//登录页面不过滤
                arg2.doFilter(arg0, arg1);//递交给下一个过滤器
                return;
            }
            if(path.indexOf("/register.jsp")>-1){//注册页面不过滤
                arg2.doFilter(request, response);
                return;
            }
            
            if(uid!=null){//已经登录
                arg2.doFilter(request, response);//放行,递交给下一个过滤器
                
            }else{
                response.sendRedirect("login.jsp");
            }
    
        }
    复制代码

         例2:设置字符编码

    复制代码
    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
              HttpServletRequest request2=(HttpServletRequest) request;
              HttpServletResponse response2=(HttpServletResponse) response;
              
              request2.setCharacterEncoding("UTF-8");  
              response2.setCharacterEncoding("UTF-8"); 
              
              chain.doFilter(request, response); 
    
        }
    复制代码
  • 相关阅读:
    DataGrid( 数据表格) 组件[2]
    DataGrid( 数据表格) 组件[1]
    Form( 表单) 组件
    Slider( 滑动条) 组件
    内存管理-常见内存泄露-(5)
    Android 内存管理分析(四)
    Android 之 内存管理-查看内存泄露(三)
    Android 内存管理(二)
    正确认识Android的内存管理机制,合理关闭进程 (一)
    谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8694964.html
Copyright © 2011-2022 走看看