• 过滤器Filter


    1、filter简介
    用于请求预处理响应后处理)servlet过滤器是servlet的一种特殊用法,主要用来完成一些通用的操作,如编码过滤、判断用户登录、使浏览器不缓存页面等。
    过滤器可改变用户请求的web资源(请求的路径)

     2、Servlet过滤器创建步骤:
        A:类实现java.servlet.Filter接口。
        B:实现init()方法,读取过滤器的配置参数。
        C:实现doFilter()方法,完成对请求或过滤的响应。
        D:调用FilterChain接口的doFilter()方法,向后续的过滤器传递请求或响应。
        F:在web.xml文件中配置Filter.

    注意:Filter拦截请求的顺序是根据<filter-mapping>在web.xml中的配置顺序排列的。
        映射Filter:
    <filter-mapping>元素用于设置一个filter所负责拦截的资源。一个Filter拦截的资源可通过两种方式进行设置:Servlet名称和资源请求访问的路径(url样式)
    <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器名字。
    <url-pattern>设置filter所拦截的请求路径(过滤器关联的URL样式)
    <servlet-name>指定过滤器所拦截的Servlet名称
    <dispatcher>指定过滤器所拦截的资源被servlet容器调用的方式。可以是request、include、forward、error之一。默认为request,可以设置多个<dispatcher>子元素用来指定Filter对资源的多种调用方式进行拦截。
     
    3、<dispatcher>元素:
    ①:request: 当用户直接访问页面时,web容器将会调用过滤器。如果目标页面是通过request.getRequestDispatcher()的include()或forward()方法访问时,那么该过滤器就不会调用该过滤器。
    ②:forward:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    <jsp:forward page="/...." />或通过page指令的errorPage转发页面。<%@page errorPage="test.jsp"%>也将被拦截
    ③:include:如果目标页面是通过RequestDispatcher的include()方法访问时,请求将被拦截,除此之外该过滤器不会被调用。或<jsp:include file="......"/>也将被拦截
    ④:error:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外不会被调用。
    在web.xml中进行声明:
    <error-page>
        <exception-type>java.lang.ArithmeticException</exception-type>
        <location>/test.jsp</location>
    </error-page>

    然后在过滤器映射路径(url-pattern)中拦截“/test.jsp”即可。


     
    4、典型应用
    1、编码过滤   
    reuqest.setCaracterEncoding("UTF-8");
    response .setContentType("text/html;charset=UTF-8");

    2、判断用户登录
    3、使浏览器不缓存页面
        有三个HTTP响应头字段可以禁止浏览器缓存当前页面:
       

    response.setDataHeader("Expires",-1);
    response.setHeader("Cache-Control","no-cache");
    response.setHeader("Pragma","no-cache");


        并不是所有的浏览器都能完全的支持上面的三个响应头,因此最好是同时使用上面的三个响应头

     

    注意:
    若某些资源不需要经过指定Filter过滤,则可按如下步骤操作:
    ①:在web.xml中配置不需要过滤的资源

    <context-param>
         <param-name>uncheckedUrls</param-name> 
         <param-value>/login/a.jsp,/login/b.jsp....</param-value>    
    </context-param>


    ②:在该filter的doFilter()方法中获取请求的servletPath并与上面配置的路径进行比较,若存在则调用 chain.doFilter(request, response);直接分发到下一个filter并返回:
    获取请求servletPath : request.getServletPath();

    最后附上一张图,说明过滤器链的执行过程(来自慕课网):

  • 相关阅读:
    【JavaScript数据结构系列】04-优先队列PriorityQueue
    【JavaScript数据结构系列】02-栈Stack
    【JavaScript数据结构系列】01-数组Array
    【JavaScript数据结构系列】00-开篇
    2019个人年度总结
    批处理·命令行中常用的操作
    flutter 环境出错后排查
    [图解算法]线性时间选择Linear Select——<递归与分治策略>
    阿里云轻量应用服务器——配置MySQL远程连接(踩坑,LAMP+CentOS)
    [知识复习] C语言文件读写
  • 原文地址:https://www.cnblogs.com/yinz/p/5461298.html
Copyright © 2020-2023  润新知