zoukankan      html  css  js  c++  java
  • 创建并配置Filter

      创建Filter需要两个步骤:

    1. 创建FIlter处理类。
    2. web.xml文件中配置Filter。

      创建Filter类

      创建Filter必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法:

    • void init(FilterConfig config);用于完成Filter的初始化。
    • void destroy();用于Filter销毁前,完成某些资源的回收。
    • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);实现过滤功能,对每个请求及响应增加的额外处理。

      以下是一个日志Filter的代码示例,负责拦截所有的用户请求,将请求的信息记录在日志中。

    @WebFilter(filterName="log",urlPatterns={"/*"})
    public class LogFilter implements Filter
    {
        //FilterConfig可用于访问Filter的配置信息
        private FilterConfig config;
        //实现初始化方法
        public void init(FilterConfig config)
        {
            this.config = config;
        }
        //实现销毁方法
        public void destroy()
        {
            this.config = null;
        }
        //执行过滤的核心方法
        public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException,ServletException
        {
            //-----------下面代码用于对用户请求执行预处理---------------
            //获取ServletContext对象,用于记录日志
            ServletContext context = this.config.getServletContext();
            long before = System.currentTimMillis();
            System.out.println("开始过滤.......");
            //将请求转换成HttpServletRequest请求
            HttpServletRequest hrequest = (HttpServletRequest)request;
            //输出提示信息
            System.out.println("Filter已将接货到用户的请求的地址:"+hrequest.getServletPath());
            //Filter只是链式处理,请求依然方形到目的地址
            chain.doFilter(request,response);//预处理与后处理的分界线
            //---------------下面代码用于对服务器响应执行后处理-----------
            long after = System.currentTimeMillis();
            //输出提示信息
            System.out.println("过滤结束");
            //输出提示信息
            System.out.println("请求被定位到" + hrequest.getRequestURI() + " 所花的时间为:" + (after-before));
       }
    }

      在上面的请求Filter中,仅在日志中记录请求的URL,对所有的请求都执行chain.doFilter方法,当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HttpSession,判断用户权限是否足够,如果不够,直接调用重定向即可,无需调用chain.doFilter方法。

      配置Filter

      配置Filter和配置Servlet很像,都需要配置两个部分:

    • 配置Filter名。
    • 配置Filter拦截URL模式。

      区别在于配置Filter的URL模式通常会使用模式字符串,使得Filter可以拦截多个请求。与配置Servlet相似的是,配置Filter同样有两种方式:

    • 在Filter类中通过Annotation进行配置。
    • 在web.xml文件中通过配置文件进行配置。

      @WebFilter修饰一个Filter类,用于对Filter进行配置,它支持下表所示的常用属性。

    属性 是否必需 说明
    asyncSupported 指定该Filter是否支持异步操作模式。
    dispatcherTypes 指定该Filter仅对那种dispatcher模式的请求进行过滤,该属性支持ASYNC、ERROR、FORWARD、INCLUDE、REQUEST这5个值的任意组合,默认值为同事过滤5中模式的请求。
    displayName 指定该Filter的显示名
    filterName 指定该Filter的名称
    initParams 用于为该Filter配置参数
    servletNames 该属性值可指定多个Servlet的名称,用于指定该Filter仅对这几个Servlet执行过滤
    urlPatterns/value

    这两个属性的作用相同,都指定该Filter所拦截的URL

      在web.xml文件中配置Filter与配置Servlet相似,需要为Filter指定它所过滤的URL,并且可以配置参数。

      在web.xml文件中为该Filter增加如下配置片段:

    <!-- 定义Filter -->
    <filter>
        <!-- Filter的名字,相当与指定@WebFilter的filterName属性 -->
        <filter-name>log</filter-name>
        <!-- Filter的实现类 -->
        <filter-class>luxl.LogFilter</filter-class>
    <filter>
    
    <!-- 定义Filter拦截的URL地址 -->
    <filter-mapping>
        <!-- Filter的名字 -->
        <filter-name>log</filter-name>
        <!-- Filter负责拦截的URL,相当于指定@WebFIlter的urlPatterns属性 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

      在实际项目中,Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的代码复用。

      Filter也可以通过<init-param.../>元素或@WebFilter的initParams属性来配置初始化参数,获取Filter的初始化参数则使用FilterConfig的getInitParameter()方法。

  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/ScorchingSun/p/4019117.html
Copyright © 2011-2022 走看看