精华内容
下载资源
问答
  • 过滤器

    2016-07-18 13:58:11
    过滤器web开发中常用的开发方式,比如一些典型的应用场景: 用户身份认证、对用户请求进行记录和审核、对用户发送的数据进行替换和过滤、转换图像格式、对响应内容压缩、加密请求或响应等等。 本篇就了解下...

    过滤器是web开发中常用的开发方式,比如一些典型的应用场景:

    用户身份认证、对用户请求进行记录和审核、对用户发送的数据进行替换和过滤、转换图像格式、对响应内容压缩、加密请求或响应等等。

    本篇就了解下监听器的主要使用方法。

     

    什么是过滤器?

      过滤器的生命周期

      过滤器的生命周期与web容器相同,当web容器启动时,就会读取应用的web.xml配置文件,如果这里配置了过滤器,容器就会执行实例化,并调用过滤器的init方法。

      之后用户的每一次请求都会执行过滤器的doFilter方法。

      当web容器销毁时,就会执行destroy方法,释放资源。

      过滤器的执行过程

      过滤器看名字就能知道大概的用法,它就像一个筛子,可以筛选特定的数据或请求。执行过程如下图所示:

      用户在发送请求后,如果该请求满足过滤器的过滤规则,web容器就会执行过滤器中的doFilter方法进行特定的操作;然后通过调用FilterChain.doFilter转交给web容器。web容器执行完成后把资源返回给过滤器,再展现给用户。

     

    简单的过滤器实例

      下面通过一个简单的代码,看看过滤器的编写。

      首先,需要创建一个过滤器,过滤器集成javax.servlet.Filter接口,其中必须实现三个方法:init() doFilter() destroy()

    复制代码
    public class MyFilter implements Filter{
        public void destroy() {
            System.out.println("MyFilter destroy");
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("MyFilter start...dofilter");
            chain.doFilter(request, response);//对请求放行
            System.out.println("MyFilter end...dofilter");
        }
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("MyFilter init");
        }
    }
    复制代码

      init()方法是在web容器实例化过滤器时调用的。

      doFilter()方法是每次有请求,且满足过滤规则时调用。

      destroy()方法是web容器关闭时,调用。

     

      然后,在web.xml中配置相应的选项。如果是servlet3.0,那么支持注解的方式配置过滤器。

    复制代码
    <filter>
          <filter-name>MyFilter</filter-name>
          <filter-class>com.test.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
          <filter-name>MyFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
            <!--<dispatcher></dispatcher>-->
    </filter-mapping>
    复制代码

      其中几个必备的项:

      在<filter>中配置了过滤器,filter-name是过滤器的名字,filter-class是过滤器的类;

      在<filter-mapping>中配置了过滤器的映射规则,filter-name是过滤器的名字,url-pattern是过滤的规则,dispatcher是过滤器的分类(主要包括四种,稍后讲解)

      这里先说下过滤器的规则,如果想要全部的请求都过滤,那么可以写/*

      如果想要过滤index.jsp  index.html 可以写/index*

      如果只想过滤index.jsp,可以写成/index.jsp

     

      其次,配置好后,创建index.jsp

    View Code

      

      最后,当启动web容器后,可以在控制台中发现,初始化时,执行了init方法

      访问对应的web资源,可以看到控制台按照执行的顺序打印消息:

    多个过滤器操作

      多个过滤器执行与上面差不多。

      在上面代码的基础上,再增加一个过滤器:

    复制代码
    public class SecondFilter implements Filter{
        public void destroy() {
            System.out.println("SecondFilter destroy()");
        }
        public void doFilter(ServletRequest arg0, ServletResponse arg1,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("SecondFilter doFilter start");
            chain.doFilter(arg0, arg1);
            System.out.println("SecondFilter doFilter end");
        }
    
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("SecondFilter init()");
        }
    }
    复制代码

      在web.xml中增加过滤器配置

    复制代码
      <filter>
          <filter-name>SecondFilter</filter-name>
          <filter-class>com.test.filter.SecondFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>SecondFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
      </filter-mapping>
    复制代码

      启动web容器,控制台输出init信息

      访问页面,可以看到由于在web.xml中映射配置MyFilter在SecondFilter上面,

      因此输出如下消息:

     

      类似的,如果把SecondFilter配置放在上面,就会先执行SecondFilter的doFilter方法。

    过滤器的分类

      最后看一下过滤器的分类,过滤器主要包括四种,REQUEST\FORWARD\INCLUDE\ERROR(3.0额外新增了一个异步请求ASYNC)。

      上面的过滤器都是采用REQUEST的方式,直接请求。由于没有配置dispathcer,默认就会按照REQUEST的方式进行

      直接看一下FORWARD的使用方法,在doFilter中执行下面的方法:

    复制代码
    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("MyFilter start...dofilter");
            HttpServletRequest req = (HttpServletRequest)request;
            req.getRequestDispatcher("main.jsp").forward(request, response);
            System.out.println("MyFilter end...dofilter");
    }
    复制代码

      此时页面请求就会直接跳转到main.jsp,触发FORWARD类型过滤器,过滤器配置选项如下:

    复制代码
      <filter>
          <filter-name>MyFilter</filter-name>
          <filter-class>com.test.filter.MyFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>MyFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
      </filter-mapping>
      <filter>
          <filter-name>SecondFilter</filter-name>
          <filter-class>com.test.filter.SecondFilter</filter-class>
      </filter>
    <!--     <filter-mapping>
          <filter-name>SecondFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
      </filter-mapping> -->
      <filter-mapping>
          <filter-name>SecondFilter</filter-name>
          <url-pattern>/main.jsp</url-pattern>
          <dispatcher>FORWARD</dispatcher>
      </filter-mapping>
    复制代码

      启动后发现,原本请求Index.jsp跳转到了main.jsp。

      此时,如果第二个过滤器采用的是REQUEST,就不会触发了。

      另外,还可以使用JSP页面标签,执行跳转,此时过滤器也可以触发。比如在JSP页面中添加<jsp:forward>标签

    复制代码
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    
    
    <jsp:forward page="/main.jsp"></jsp:forward>
    
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    
    </body>
    </html>
    复制代码

      INCLUDE与FORWARD类似,使用方法也相同,只是名字不同而已,就不做过多的介绍了。

      然后看一下ERROR过滤器,通常我们会在web.xml中配置错误页面,如下:

    <error-page>
          <error-code>404</error-code>
        <location>/error.jsp</location>
      </error-page>

      此时,如果访问不存在的页面,http://localhost:8080/xxx.jsp就会跳转到error.jsp

      此时如果过滤器通过REQUEST方式,想要触发,url填写的是/error.jsp并不会起作用,此时就需要把dispathcer改成 ERROR,并且放置在error-page标签下面:

    复制代码
      <error-page>
          <error-code>404</error-code>
        <location>/error.jsp</location>
      </error-page>
      <!-- 需要放在errorpage下面 -->
      <filter>
          <filter-name>ErrorFilter</filter-name>
          <filter-class>com.test.filter.ErrorFilter</filter-class>
      </filter> 
      <filter-mapping>
          <filter-name>ErrorFilter</filter-name>
          <url-pattern>/error.jsp</url-pattern>
          <dispatcher>ERROR</dispatcher>
      </filter-mapping>
    复制代码

      这样就会触发ERROR过滤器了。

    参考

    【1】过滤器的应用:http://www.ylzx8.cn/web/web/979338.html

    【2】过滤器视频教程:http://www.imooc.com/learn/213

    展开全文
  • Filter过滤器

    2020-12-30 17:12:58
    Filter过滤器的作用是:拦截请求(常用),过滤响应。 拦截请求的常见的应用场景有: 权限检查 日记操作 事务管理 …… 二:Filter的初体验 要求:在你的web工程下,有一个admin目录,这个admin目录下的所有...

    Filter过滤器

    一:介绍

    1. Filter过滤器是JavaWeb的三大组件之一。三大组件分别是:Servlet程序,Listener监听器,Filter过滤器。
    2. Filter过滤器是JavaEE的规范,也就是接口。
    3. Filter过滤器的作用是:拦截请求(常用),过滤响应。

    拦截请求的常见的应用场景有:

    1. 权限检查
    2. 日记操作
    3. 事务管理
    4. ……

    二:Filter的初体验

    要求:在你的web工程下,有一个admin目录,这个admin目录下的所有资源(html页面,jpg图片,jsp文件等等)都必须是在用户登录后才允许访问。
    思考:根据我们之前学过的内容,我们知道,用户登录之后都会把用户登陆的信息保存到Session域中,所以要检查登录,可以判断Session中是否包含用户登录的信息即可。

    //web.xml文件
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <!--filter标签用于配置一个Filter过滤器-->
      <filter>
        <!--给Filter起一个别名-->
        <filter-name>AdminFilter</filter-name>
        <!--配置Filter的全类名-->
        <filter-class>filter.AdminFilter</filter-class>
      </filter>
    <!--filter-mapping配置Filter过滤器的拦截路径-->
      <filter-mapping>
        <!--filter-name表示当前的拦截路径给哪个Filter使用-->
        <filter-name>AdminFilter</filter-name>
        <!--url-pattern配置拦截路径
          / 表示请求地址为:http://ip:port/工程路径/ 映射到idea的web目录
          /admin/*  表示请求地址为:http://ip:port/工程路径/admin/*
        -->
        <url-pattern>/admin/*</url-pattern>
      </filter-mapping>
    </web-app>
    
    //AdminFilter.java文件
    public class AdminFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
        /**
         * doFilter()方法,专门用于拦截请求,(过滤响应)可以做权限检查
         * @param request
         * @param response
         * @param chain
         * @throws IOException
         * @throws ServletException
         */
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest = (HttpServletRequest)request;
            HttpSession session = httpServletRequest.getSession();
            Object user = session.getAttribute("user");
            //如果等于null,说明还没有登录
            if (user == null){
                request.getRequestDispatcher("/login.jsp").forward(request,response);
                return;
            }else {
                //让程序继续往下访问用户的目标资源
                chain.doFilter(request,response);
            }
        }
        @Override
        public void destroy() {
        }
    }
    

    三:Filter的生命周期

    Filter的生命周期包含几个方法

    1. 构造器方法
    2. init初始化方法
      1. 第1,2步,在web工程启动的时候执行(Filter已经创建)
    3. doFilter过滤方法
      1. 第三步,每次拦截到请求,就会执行
    4. destory销毁方法
      1. 第四步,停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)

    三:FilterConfig类

    FilterConfig类,见名知义,他是一个Filter过滤器的配置文件。
    Tomcat每次创建Filter的时候,也会创建一个FilterConfig类,这里包含了Filter配置文件的配置信息。

    FilterConfig类的作用是获取Filter过滤器的配置内容:

    1. 获取filter的名称,即filter-name的内容。
    2. 获取在Filter中配置的init-param的初始化参数
    3. 获取ServletContext对象

    演示:

    //web.xml文件
      <filter>
        <init-param>
          <param-name>username</param-name>
          <param-value>root</param-value>
        </init-param>
        <init-param>
          <param-name>url</param-name>
          <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
      </filter>
    
    //AdminFilter.java文件中的init()方法
    public void init(FilterConfig filterConfig) throws ServletException {
            //1.获取filter的名称,即filter-name的内容。
            System.out.println("filter-name的值是:"+filterConfig.getFilterName());
            //2.获取在Filter中配置的init-param的初始化参数
            System.out.println("初始化参数username的值是:"+filterConfig.getInitParameter("username"));
            System.out.println("初始化参数url的值是:"+filterConfig.getInitParameter("url"));
            //3.获取ServletContext对象
            System.out.println(filterConfig.getServletContext());
        }
    

    四:FilterChain过滤器链

    FilterChain.doFilter()方法的作用:

    1. 执行下一个Filter过滤器(如果有Filter的话)
    2. 执行目标资源(没有Filter)

    在多个Filter过滤器执行的时候,他们执行的优先顺序是由他们在web.xml中从上到下的配置的顺序决定的。

    演示

    //Filter1.java文件
    public class Filter1 implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("Filter1 前置代码");
            chain.doFilter(request,response);
            System.out.println("Filter1 后置代码");
        }
        @Override
        public void destroy() {
    
        }
    }
    
    //Filter2.java文件
    public class Filter2 implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("Filter2 前置代码");
            chain.doFilter(request,response);
            System.out.println("Filter2 后置代码");
        }
        @Override
        public void destroy() {
    
        }
    }
    
    //target.jsp文件
    <body>
        <%
            System.out.println("target.jsp页面执行了");
        %>
    </body>
    
    //结果
    Filter1 前置代码
    Filter2 前置代码
    target.jsp页面执行了
    Filter2 后置代码
    Filter1 后置代码
    

    多个Filter过滤器执行的特点:

    1. 所有Filter和目标资源默认都执行在同一个线程中
    2. 多个Filter共同执行的时候,他们都使用同一个Request对象。

    五:Filter的拦截路径

    (1)精确匹配

      <url-pattern>/target.jsp</url-pattern>
    

    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

    (2)目录匹配

        <url-pattern>/admin/*</url-pattern>
    

    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

    (3)后缀名匹配

    <url-pattern>*.html</url-pattern>
    

    以上配置的路径,表示请求地址必须以html结尾才会拦截到




















    展开全文
  • JavaWeb Filter过滤器

    2021-01-06 21:38:52
    1、Filter过滤器简介 ...拦截请求常见的应用场景有: (1)权限检查(常用) (2)日记操作 (3)事务管理 ……等等 2、Filter实例演示 要求:在你的web 工程下,有一个admin 目录。这个admin 目录下的

    1、Filter过滤器简介

    (1)Filter 过滤器它是JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
    (2)Filter 过滤器它是JavaEE 的规范。也就是接口
    (3)Filter 过滤器它的作用是:拦截请求(常用),过滤响应。

    拦截请求常见的应用场景有:
    (1)权限检查(常用)
    (2)日记操作
    (3)事务管理
    ……等等

    2、Filter实例演示

    要求:在你的web 工程下,有一个admin 目录。这个admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必
    须是用户登录之后才允许访问。

    public class AdminFilter implements Filter {
      /**
      * doFilter 方法,专门用于拦截请求。可以做权限检查
      */
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
        // 如果等于null,说明还没有登录
        if (user == null) {
           servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
          return;
        } else {
          // 让程序继续往下访问用户的目标资源
          filterChain.doFilter(servletRequest,servletResponse);
        }
      }
    }

    web.xml中的配置

    <!--filter 标签用于配置一个Filter 过滤器-->
    <filter>
            <!--给filter 起一个别名-->
            <filter-name>AdminFilter</filter-name>
            <!--配置filter 的全类名-->
            <filter-class>com.atguigu.filter.AdminFilter</filter-class>
    </filter>

    <!--filter-mapping 配置Filter 过滤器的拦截路径-->

     <filter-mapping>
            <!--filter-name 表示当前的拦截路径给哪个filter 使用-->
            <filter-name>AdminFilter</filter-name>
            <!--url-pattern 配置拦截路径
             / 表示请求地址为:http://ip:port/工程路径/ 映射到IDEA 的web 目录
            /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*  *表示该目录下所有文件
    -->
            <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

    扩展:Filter的拦截路径<url-pattern> 说明

    (1)--精确匹配
    <url-pattern>/target.jsp</url-pattern>
    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

    (2)--目录匹配
    <url-pattern>/admin/*</url-pattern>
    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

    (3)--后缀名匹配
    <url-pattern>*.html</url-pattern>
    以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
    <url-pattern>*.do</url-pattern>
    以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
    <url-pattern>*.action</url-pattern>
    以上配置的路径,表示请求地址必须以.action 结尾才会拦截到

    Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

     

    3、Filter的生命周期

    通过查看以下代码在控制台的输出情况,我们容易得出:

    public class AdminFilter implements Filter {
    
      public AdminFilter(){
        System.out.println("1.Filter构造器方法AdminFilter()");
      }
      @Override
      public void init(FilterConfig filterConfig)throws ServletException{
        System.out.println("2.Filter的init()方法初始化");
      }
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("3.Filter的Dofilter()过滤方法");
      }
        
      @Override
      public void destroy(){
        System.out.println("4、Filter的destroy()销毁方法");
      }
    }

    Filter 的生命周期包含几个方法:

    (1)构造器方法

    (2)init 初始化方法
    说明:第1,2 步,在web 工程启动的时候执行(Filter 已经自动创建)

    (3)doFilter 过滤方法
    说明:每次拦截到请求,就会执行 doFilter()方法

    (4)destroy 销毁
    说明:停止web 工程的时候,就会自动执行(停止web 工程,也会销毁Filter 过滤器)

    4、FilterConfig类

    FilterConfig 类见名知义,它是Filter 过滤器的配置文件类。

    Tomcat 每次创建Filter 的时候,也会同时创建一个FilterConfig 类,这里包含了Filter 配置文件的配置信息。

    FilterConfig 类的作用是获取filter 过滤器的配置内容
    (1)获取Filter 的名称filter-name 的内容
    (2)获取在Filter 中配置的init-param 初始化参数
    (3)获取ServletContext 对象

    public class AdminFilter implements Filter {
    
      @Override
      public void init(FilterConfig filterConfig)throws ServletException{
        System.out.println("2.Filter的init()方法初始化");
    
        //1、获取Filter 的名称filter-name 的内容
        System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
        // 2、获取在web.xml 中配置的init-param 初始化参数
        System.out.println("初始化参数username 的值是:" + filterConfig.getInitParameter("username"));
        System.out.println("初始化参数url 的值是:" + filterConfig.getInitParameter("url"));
        // 3、获取ServletContext 对象
        System.out.println(filterConfig.getServletContext());
      }
     
    }

    web.xml配置文件

    <!--filter 标签用于配置一个Filter 过滤器-->
    <filter>
      <!--给filter 起一个别名-->
      <filter-name>AdminFilter</filter-name>
      <!--配置filter 的全类名-->
      <filter-class>com.atguigu.filter.AdminFilter</filter-class>
    
      <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
      </init-param>
      <init-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost3306/test</param-value>
      </init-param>
    </filter>

    5、FiltereChain 过滤器链

    多个过滤器链一起工作

    public class Filter1 implements Filter{
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter1前置代码");
    
        filterChain.doFilter(servletRequest,servletResponse);
        
        System.out.println("Filter1后置代码");
        
      }
    }
    
    public class Filter2 implements Filter{
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter2前置代码");
    
        filterChain.doFilter(servletRequest,servletResponse);
        
        System.out.println("Filter2后置代码");
        
      }
    }

    配置文件 web.xml

    <!--filter 标签用于配置一个Filter 过滤器-->
    <filter>
            <!--给filter 起一个别名-->
            <filter-name>Filter1</filter-name>
            <!--配置filter 的全类名-->
            <filter-class>com.atguigu.filter.Filter1</filter-class>
    </filter>
    
    <!--就拦截一个jsp吧-->
    
     <filter-mapping>
            <filter-name>Filter1</filter-name>
            <url-pattern>/target.jsp</url-pattern>
    </filter-mapping>
    
    
    <filter>
            <filter-name>Filter2</filter-name>
            <filter-class>com.atguigu.filter.Filter2</filter-class>
    </filter>
    
     <filter-mapping>
            <filter-name>Filter2</filter-name>
            <url-pattern>/target.jsp</url-pattern>
    </filter-mapping>

    以上代码可验证,Filter的执行顺序

    展开全文
  • 过滤器导图详解

    2017-12-05 20:31:00
    过滤器web开发中常用的开发方式,比如一些典型的应用场景: 用户身份认证、对用户请求进行记录和审核、对用户发送的数据进行替换和过滤、转换图像格式、对响应内容压缩、加密请求或响应等等。 本篇就了解下监听器...

    过滤器是web开发中常用的开发方式,比如一些典型的应用场景:

    用户身份认证、对用户请求进行记录和审核、对用户发送的数据进行替换和过滤、转换图像格式、对响应内容压缩、加密请求或响应等等。

    本篇就了解下监听器的主要使用方法。

     

    什么是过滤器?

      过滤器的生命周期

      过滤器的生命周期与web容器相同,当web容器启动时,就会读取应用的web.xml配置文件,如果这里配置了过滤器,容器就会执行实例化,并调用过滤器的init方法。

      之后用户的每一次请求都会执行过滤器的doFilter方法。

      当web容器销毁时,就会执行destroy方法,释放资源。

      过滤器的执行过程

      过滤器看名字就能知道大概的用法,它就像一个筛子,可以筛选特定的数据或请求。执行过程如下图所示:

      用户在发送请求后,如果该请求满足过滤器的过滤规则,web容器就会执行过滤器中的doFilter方法进行特定的操作;然后通过调用FilterChain.doFilter转交给web容器。web容器执行完成后把资源返回给过滤器,再展现给用户。

     

    简单的过滤器实例

      下面通过一个简单的代码,看看过滤器的编写。

      首先,需要创建一个过滤器,过滤器集成javax.servlet.Filter接口,其中必须实现三个方法:init() doFilter() destroy()

    public class MyFilter implements Filter{
        public void destroy() {
            System.out.println("MyFilter destroy");
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("MyFilter start...dofilter");
            chain.doFilter(request, response);//对请求放行
            System.out.println("MyFilter end...dofilter");
        }
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("MyFilter init");
        }
    }

      init()方法是在web容器实例化过滤器时调用的。

      doFilter()方法是每次有请求,且满足过滤规则时调用。

      destroy()方法是web容器关闭时,调用。

      然后,在web.xml中配置相应的选项。如果是servlet3.0,那么支持注解的方式配置过滤器。

    <filter>
          <filter-name>MyFilter</filter-name>
          <filter-class>com.test.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
          <filter-name>MyFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
            <!--<dispatcher></dispatcher>-->
    </filter-mapping>

      其中几个必备的项:

      在<filter>中配置了过滤器,filter-name是过滤器的名字,filter-class是过滤器的类;

      在<filter-mapping>中配置了过滤器的映射规则,filter-name是过滤器的名字,url-pattern是过滤的规则,dispatcher是过滤器的分类(主要包括四种,稍后讲解)

      这里先说下过滤器的规则,如果想要全部的请求都过滤,那么可以写/*

      如果想要过滤index.jsp  index.html 可以写/index*

      如果只想过滤index.jsp,可以写成/index.jsp

     

      其次,配置好后,创建index.jsp

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
        This is Filter JSP!
        <%
            System.out.println("index jsp");
        %>
    </body>
    </html>

      

      最后,当启动web容器后,可以在控制台中发现,初始化时,执行了init方法

      访问对应的web资源,可以看到控制台按照执行的顺序打印消息:

    多个过滤器操作

      多个过滤器执行与上面差不多。

      在上面代码的基础上,再增加一个过滤器:

    public class SecondFilter implements Filter{
        public void destroy() {
            System.out.println("SecondFilter destroy()");
        }
        public void doFilter(ServletRequest arg0, ServletResponse arg1,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("SecondFilter doFilter start");
            chain.doFilter(arg0, arg1);
            System.out.println("SecondFilter doFilter end");
        }
    
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("SecondFilter init()");
        }
    }

      在web.xml中增加过滤器配置

      <filter>
          <filter-name>SecondFilter</filter-name>
          <filter-class>com.test.filter.SecondFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>SecondFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
      </filter-mapping>

      启动web容器,控制台输出init信息

      访问页面,可以看到由于在web.xml中映射配置MyFilter在SecondFilter上面,

      因此输出如下消息:

     

      类似的,如果把SecondFilter配置放在上面,就会先执行SecondFilter的doFilter方法。

    过滤器的分类

      最后看一下过滤器的分类,过滤器主要包括四种,REQUEST\FORWARD\INCLUDE\ERROR(3.0额外新增了一个异步请求ASYNC)。

      上面的过滤器都是采用REQUEST的方式,直接请求。由于没有配置dispathcer,默认就会按照REQUEST的方式进行

      直接看一下FORWARD的使用方法,在doFilter中执行下面的方法:

    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("MyFilter start...dofilter");
            HttpServletRequest req = (HttpServletRequest)request;
            req.getRequestDispatcher("main.jsp").forward(request, response);
            System.out.println("MyFilter end...dofilter");
    }

      此时页面请求就会直接跳转到main.jsp,触发FORWARD类型过滤器,过滤器配置选项如下:

      <filter>
          <filter-name>MyFilter</filter-name>
          <filter-class>com.test.filter.MyFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>MyFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
      </filter-mapping>
      <filter>
          <filter-name>SecondFilter</filter-name>
          <filter-class>com.test.filter.SecondFilter</filter-class>
      </filter>
    <!--     <filter-mapping>
          <filter-name>SecondFilter</filter-name>
          <url-pattern>/index.jsp</url-pattern>
      </filter-mapping> -->
      <filter-mapping>
          <filter-name>SecondFilter</filter-name>
          <url-pattern>/main.jsp</url-pattern>
          <dispatcher>FORWARD</dispatcher>
      </filter-mapping>

      启动后发现,原本请求Index.jsp跳转到了main.jsp。

      此时,如果第二个过滤器采用的是REQUEST,就不会触发了。

      另外,还可以使用JSP页面标签,执行跳转,此时过滤器也可以触发。比如在JSP页面中添加<jsp:forward>标签

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>

    <jsp:forward page="/main.jsp"></jsp:forward>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> </body> </html>

      INCLUDE与FORWARD类似,使用方法也相同,只是名字不同而已,就不做过多的介绍了。

      然后看一下ERROR过滤器,通常我们会在web.xml中配置错误页面,如下:

    <error-page>
          <error-code>404</error-code>
        <location>/error.jsp</location>
      </error-page>

      此时,如果访问不存在的页面,http://localhost:8080/xxx.jsp就会跳转到error.jsp

      此时如果过滤器通过REQUEST方式,想要触发,url填写的是/error.jsp并不会起作用,此时就需要把dispathcer改成 ERROR,并且放置在error-page标签下面:

      <error-page>
          <error-code>404</error-code>
        <location>/error.jsp</location>
      </error-page>
      <!-- 需要放在errorpage下面 -->
      <filter>
          <filter-name>ErrorFilter</filter-name>
          <filter-class>com.test.filter.ErrorFilter</filter-class>
      </filter> 
      <filter-mapping>
          <filter-name>ErrorFilter</filter-name>
          <url-pattern>/error.jsp</url-pattern>
          <dispatcher>ERROR</dispatcher>
      </filter-mapping>

      这样就会触发ERROR过滤器了。

    参考

    【1】过滤器的应用:http://www.ylzx8.cn/web/web/979338.html

    【2】过滤器视频教程:http://www.imooc.com/learn/213

    本文转自博客园xingoo的博客,原文链接:过滤器导图详解,如需转载请自行联系原博主。
    展开全文
  • filter常用场景

    2017-11-21 11:38:26
    javaweb学习总结(四十六)——Filter(过滤器)常见应用 一、统一全站字符编码  通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 ...
  • JSP过滤器导图详解

    2016-08-23 09:11:53
    过滤器web开发中常用的开发方式,比如一些典型的应用场景: 用户身份认证、对用户请求进行记录和审核、对用户发送的数据进行替换和过滤、转换图像格式、对响应内容压缩、加密请求或响应等等。 本篇就了解下...
  • 10-Filter过滤器

    2020-08-01 08:40:53
    拦截请求的常用应用场景有: 权限检查 日记操作 事务管理 3.使用步骤 要求:在Web工程下需要一个admin目录,这个目录下的所有资源都必须是用户登录之后才可以访问。 编写一个类去实现Filter接口 实现过滤...
  • 项目开发视频: SpringCloud微服务开发入门 手把手开发基于SpringBoot的...应用场景: 网站启动后做预先工作,如:加载缓存 加载配置文件,如:Spring通过监听对配置进行加载 常用的监听: ServletContextList
  • 应用配置参数检查过滤器(ParameterValidationFilter) 一般来说,在容器上增加WAF模块,通用性更强,但在特殊场景下还是会用到在应用内部添加拦截器来实现xss防范。两类实现核心的逻辑实现基本上都是OWASP组织提供...
  • 使用过滤器防御XSS攻击4. 使用#传递参数防御SQL注入攻击 1. 什么是XSS攻击&XSS攻击应用场景 XSS其实就是使用javascript脚本语言注入进行攻击 XSS攻击场景: 具体例子A请求提交表单信息,表单信息转发到另一个...
  • 6.3.2 使用输入过滤器约束用户输入 118 6.3.3 使用Spinner Widget的下拉列表约束用户输入 119 6.4 使用按钮、多选框和单选组 121 6.4.1 使用基本按钮 122 6.4.2 使用多选框和Toggle按钮 123 6.4.3 使用...
  • 媒体查询 CSS媒体查询允许开发者基于浏览网站的设备的特性来应用不同的样式申明,最常用的特性是视口宽度。 GCF 谷歌内嵌浏览器框架, 使用此插件,用户可以通过Internet Explorer的用户界面,以Chrome内核的渲染方式...
  • 总结记录一下AOP常用应用场景及使用方式,如有错误,请留言. 1. 讲AOP之前,先来总结web项目的几种拦截方式 A: 过滤器 使用过滤器可以过滤URL请求,以及请求和响应的信息,但是过滤器是只是针对J2EE规范实现的,...
  • 【DB系列】Redis高级特性之Bitmap使用姿势及应用场景介绍 【DB系列】Redis高级特性之发布订阅 【DB系列】Redis高级特性之HyperLoglog 【DB系列】Redis高级特性之GEO 【DB系列】Redis集群环境配置 【DB系列】借助...
  • 6.5.3 为GridView过滤器增加Ajax支持 168 6.5.4 一个实时的过滤器 168 6.6 小结 171 第二部分 高级技术 第7章 UpdatePanel深入剖析 174 7.1 PageRequestManager:无名英雄 174 7.1.1 客户端事件模型 175 ...
  • 6.5.3 为GridView过滤器增加Ajax支持 168 6.5.4 一个实时的过滤器 168 6.6 小结 171 第二部分 高级技术 第7章 UpdatePanel深入剖析 174 7.1 PageRequestManager:无名英雄 174 7.1.1 客户端事件模型 175 ...
  • 7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...
  • Spring3 Security3 官方中文文档.pdf

    热门讨论 2010-12-12 10:57:32
    7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...
  • JSP第二篇【内置对象的介绍、4种属性范围、应用场景】 JSP第三篇【JavaBean的介绍、JSP的行为--JavaBean】 JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】 JSP...
  • CopyOnWrite的原理、应用场景、缺点、需要注意的事情 查找Java进程中占用CPU最多的线程 确定进程ID,使用jps -v或top查看 查看该进程哪个线程占用大量CPU,top -H -p [PID] 将进程中所有线程输出到文件,...
  • 7.4. 使用其他过滤器—— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...
  • 对本门课程所用到的技术进行概览 1-1 学前必读(助你平稳踩坑,畅学无忧) 1-2 导学 1-3 课程技术分析 第2章 HBase简介与环境部署 介绍HBase是什么,能做什么,有哪些优缺点,适用于哪些应用场景,与常用关系数据库...
  • 实战Hadoop:开启通向云计算的捷径

    千次下载 热门讨论 2013-07-31 17:03:25
    2.4.1 应用场景 2.4.2 设计实现 参考文献 第3章 分久必合——MapReduce 3.1 MapReduce基础 3.1.1 MapReduce编程模型 3.1.2 MapReduce的集群行为 3.2 样例分析:单词计数 3.2.1 WordCount源码分析 3.2.2 ...
  • Spring API

    2009-09-24 18:15:56
    3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一个LoadTimeWeaver 4. 资源 4.1. 简介 4.2. Resource接口 ...
  • Spring中文帮助文档

    热门讨论 2013-08-05 14:40:17
    3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一个LoadTimeWeaver 4. 资源 4.1. 简介 4.2. Resource接口 ...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

web过滤器常用应用场景