精华内容
参与话题
问答
  • java过滤器Filter

    万次阅读 多人点赞 2019-07-31 19:08:31
    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它...

    一、简介

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应 (Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的 web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁,以下通过代码示例来了解它 的使用。

    二、实例

    package test.filter; 
    import ...; 
    /**
     * 介绍过滤器的使用,以设置编码为例
     */
    public class MyFilter implements Filter { 
      private FilterConfig config = null; 
      private boolean isFilter = false;
      
      public void destroy() { 
       System.out.println("MyFilter准备销毁..."); 
      } 
      
      public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException { 
       // 强制类型转换 
       HttpServletRequest request = (HttpServletRequest)arg0; 
       HttpServletResponse response = (HttpServletResponse)arg1; 
       // 获取web.xm设置的编码集,设置到Request、Response 中   
       request.setCharacterEncoding(config.getInitParameter("charset"));   
       response.setContentType(config.getInitParameter("contentType"));   
       response.setCharacterEncoding(config.getInitParameter("charset"));   
       // 将请求转发到目的地继续执行
       chain.doFilter(request, response);
      } 
      
      public void init(FilterConfig arg0) throws ServletException { 
       this.config = arg0; 
       if(isFilter){
          System.out.println("MyFilter初始化..."); 
       }
      } 
      
      private void setIsFilter(boolean isFilter){
    	this.isFilter = isFilter;
      }
    }

    然后在web. xml中配置该过滤器:

     <filter>
     	<filter-name>MyFilter</filter-name>
     	<filter-class>test.filter.MyFilter</filter-class>
     	<init-param>
     		<param-name>isFilter</param-name>
     		<param-value>true</param-value>
     	</init-param>
     </filter>
     <filter-mapping>
     	<filter-name>MyFilter</filter-name>
     	<url-pattern>/*</url-pattern>
     	<dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 -->
     	<dispatcher>FORWARD</dispatcher>
     	<dispatcher>ERROR</dispatcher>
     	<dispatcher>INCLUDE</dispatcher>
     </filt

    三、详细介绍

    在doFilter方法中通常都做些什么呢,下面列举一下:

    1、通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。

    比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。
    2、在调用chain.doFilter方法之前,做些处理来达到某些目的。
    比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相应的request.getParameter方法)。
    3、在调用chain.doFilter方法之后,做些处理来达到某些目的。
    比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。

    Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应Servlet的相关配置)。

    filter-mapping标签中dispatcher指定过滤器所拦截的资源被Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

    REQUEST:

    当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问或ERROR情况时,那么该过滤器就不会被调用。

    INCLUDE:

    如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

    FORWARD:

    如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

    ERROR:

    如若在A.jsp页面page指令中指定了error属性=examError.jsp,那么A.jsp中若出现了异常,会跳转到examError.jsp中处理。而在跳转到examError.jsp时,若过滤器配置了ERROR的dispather那么则会拦截,否则不会拦截。

    四、高级配置(允许代理注入spring bean)

    web.xml中配置过滤器DelegatingFilterProxy:

     

    <filter>
        <filter-name>permission</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
     <filter-mapping>
        <filter-name>permission</filter-name>
        <url-pattern>*.htm</url-pattern>
    </filter-mapping>

    在spring bean配置中加入:

    <bean id="permission" class="你的bean"></bean>

    bean的id必须和filter-name一样。如果想不一样,可以这样配置:

    <filter>
        <filter-name>permission</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
         <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>targetBeanName</param-name>
            <param-value>test</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>permission</filter-name>
        <url-pattern>*.htm</url-pattern>
    </filter-mapping>

    在spring bean配置中加入:

    <bean id="test" class="你的bean"></bean>

    以上你的spring bean必须实现Filter接口。

    那这样子做是为了什么呢?

    答:这样做就可以将DelegatingFilterProxy所代理的filter作为spring的bean,受到spring的管理,也就是通过Spring容器来管理filter的生命周期,还有就是如果filter中需要一些Spring容器的实例,可以通过spring直接注入,另外读取一些配置文件这些便利的操作都可以通过Spring来配置实现。

    其中如果设置"targetFilterLifecycle"为True,则Filter.init()和Filter.destroy()有效;若为false,则这两个方法失效。

    如果大家有用到shiro(一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理等)的话,通常就会用到这个DelegatingFilterProxy了!

     

    展开全文
  • java过滤器

    2020-10-28 00:17:25
    java过滤器 java过滤器

    java过滤器

    java过滤器

    展开全文
  • Java过滤器

    2020-11-21 10:26:27
    java 过滤器 过滤器的作用 实现对web资源请求的拦截。完成特殊的操作,尤其对请求的预处理 web资源访问权限控制 请求字符集编码处理 内容敏感字符自会过滤 响应信息压缩 工作流程 只有...

    java 过滤器

     

     

    过滤器的作用

    实现对web资源请求的拦截。完成特殊的操作,尤其对请求的预处理

     

     

     

    web资源访问权限控制

    请求字符集编码处理

    内容敏感字符自会过滤

    响应信息压缩

     

     

    工作流程

     

    只有一个 并且长期存在内存之中

     

    实现步骤

    编写java类实现filter节后 实现其都Filter方法

    在web.xml文件中对filter类进行组测,设置并锁拦截的资源

     

    过滤器链

    在一个web应用中多个过滤器组合器来称之为一个过滤器链

    调用顺序去接与过滤器在web.xml中的注册顺序

     

    配置过滤器

     

     

    chain.doFiiter(resq,resp)通知执行下一个过滤器

     

    初始化创建过滤器对象之后 只会创建一个对象 每次访问都会通过过滤器进行处理 直到web应用移出才会从内存中移出

     

     

     

     

    过滤参数配置

    init param

     

     

    设置configFilter参数 设置get/set方法 在初始化中对congfig进行赋值 在doFilter中提取配置参数

     

     

     

     

    在过滤器中要对请求进行类型转换 之后进行业务逻辑 还要设置过滤连的下一步操作 chain。doFilter

    过滤器配置

    filter-mapping子元素dispatcher

    request默认

    include

    forward

    error

    映射地址 填写的是那个页面 那个页面就调用过滤器

     

    INCLUDE

    那个页面使用到INCLUDE 那个就调用过滤器

     

     

     

    展开全文
  • Java 过滤器

    2019-03-06 19:41:14
    文章目录一、过滤器概述1、过滤器的作用2、过滤器的应用场景3、过滤器的工作流程...​ JSP 和 Servlet 中的过滤器都是 Java 类(继承avax.servlet.Filter)。 一、过滤器概述 1、过滤器的作用 ​ 过滤器可以动态地拦...


    ​ JSP 和 Servlet 中的过滤器都是 Java 类(继承avax.servlet.Filter)。

    一、过滤器概述

    1、过滤器的作用

    ​ 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,可以实现以下目的:

    1. 在客户端的请求访问后端资源之前,拦截这些请求。
    2. 在服务器的响应发送回客户端之前,处理这些响应。

    2、过滤器的应用场景

    1. Web资源权限访问控制
    2. 请求字符集编码处理
    3. 内容敏感字符词汇速滤
    4. 响应信息压缩

    3、过滤器的工作流程

    ​ 过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到应用程序的部署描述符中的 Servlet 名称或 URL 。当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
    在这里插入图片描述

    二、过滤器生命周期与方法

    1、过滤器的生命周期

    1. web应用程序启动时, web服务器创建Filter的实例对象,以及对象的初始化。
    2. 当请求访问与过滤器关联的Web资源时,过滤器拦截请求,完成指定功能。
    3. Filter对象创建后会驻留在内存,在web应用移除或服务器停止时才销毁。
    4. 过滤器的创建和销毁由WEB服务器负责。

    2、过滤器方法

    方法 描述
    public void init(FilterConfig filterConfig) web 应用程序启动创建Filter 的实例对象,调用init方法,同时读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(每个filter对象只会创建一次,init方法也只会执行一次)。
    public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当请求访问的url和请求方法与过滤器设置url和方式匹配时,将调用过滤器的doFilter方法。
    public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

    3、过滤器的实现步骤

    1. 编写java类实现Filter接口,并实现其doFilter方法。
    2. 在web.xml文件中对filter类进行注册,并设置所拦截的资源。
    • web.xml配置
    <!-- 字符集编码过滤器配置 -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>  <!-- 过滤器的唯一标识 -->
        <filter-class>filter.CharacterEncodingFilter</filter-class>  <!-- 过滤器执行的类 -->
        <init-param>  <!-- 过滤器初始化参数,可为多个 -->
        	<param-name>charset</param-name>
        	<param-value>UTF-8</param-value>
    	</init-param>
    </filter>
    <filter-mapping>  <!-- 过滤器映射 -->
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>  <!-- 对所有的请求进行拦截处理 -->
    </filter-mapping>
    
    • 过滤器类
    public class CharacterEncodingFilter implements Filter {
        private FilterConfig config;    // 过滤器配置对象,用于获取配置的参数
        
        public FilterConfig getConfig() {
            return config;
        }
        
        public void setConfig(FilterConfig config) {
            this.config = config;
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            this.config = filterConfig;
            System.out.println("CharacterEncodingFilter do init....");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //获取初始参数
            String charset = config.getInitParameter("charset");
    
            // 设置请求内容的编码方式
            servletRequest.setCharacterEncoding(config.getInitParameter("charset"));
            
            //System.out.println("CharacterEncodingFilter 请求预处理");
            // 通知过滤器链这步过滤操作已完成
            filterChain.doFilter(servletRequest, servletResponse);
            //System.out.println("CharacterEncodingFilter 响应后处理");
        }
    
        @Override
        public void destroy() {
            System.out.println("CharacterEncodingFilter do destroy....");
        }
    }
    

    三、多个过滤器和 dispatcher

    1、多个过滤器

    ​ 只要像上面完成过滤器类的编写和注册,就可以啦,web服务器会在后台建立过滤器链进行管理。

    • 过滤器链
    1. 在一个web应用中,多个过滤器组合起来称之为一个过滤链。
    2. 过滤器的调用顺序(预处理顺序)取决于web.xml 中的 filter-mapping 元素的顺序,后处理是其逆序。

    2、dispatcher

    ​ dispatcher 是 filter-mapping 的子元素,用于指定拦截何种请求方式的url,其设置的值及其含义如下表:

    dispatcher设置值 描述
    REQUEST(默认) 当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
    INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    FORWARD 如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用

    ​ dispatcher 默认值为 REQUEST ,dispatcher 也可设置为多个已拦截不同形式的访问。

    <filter>
        <filter-name>testFilter</filter-name>
        <filter-class>filter.TestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>testFilter</filter-name>
        <url-pattern>/test2.jsp</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    
    • 测试
    <%
    	//测试dispatcher FORWARD配置
    	//request.getRequestDispatcher("/test2.jsp").forward(request, response);
    
        //测试dispatcher ERROR配置
    	//response.sendError(404);
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Test</title>
    </head>
    <body>
    	<!-- 测试dispatcher INCLUDE配置 -->
    	<jsp:include page="test2.jsp"></jsp:include>
    	<h1>Test</h1>
    </body>
    </html>
    
    展开全文
  • JAVA过滤器

    千次阅读 2018-08-16 10:27:26
    过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理 作用: 代码的抽取(可以对request设置编码,这样所有走过的...
  • java 过滤器

    2012-10-31 10:23:26
    1. java 过滤器 过滤器就是在源数据和目的数据之间起过滤作用的中间件。 Web应用中,在处理请求时,经常有一些公共的工作,比如设置字符集。这样的工作需要写在每个页面,这样的写法费力且不好修改。使用过滤...

空空如也

1 2 3 4 5 ... 20
收藏数 13,961
精华内容 5,584
关键字:

java过滤器

java 订阅