zoukankan      html  css  js  c++  java
  • 9.20JavaWeb之ServletFilter(过滤器)

    9.20JavaWeb之ServletFilter(过滤器)

    什么是Servlet过滤器?

    对 Servlet 容器传给 Web 资源的 request 对象和 response 对象进行检查和修改的一个类

    Filter的特点

    • 不是 Servlet,不能直接访问

    • 不能生成 request 对象和 response 对象

    • 只能为 Web 资源提供过滤功能

      • 在 Web 资源被访问前,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。

      • 将请求传递到下一个过滤器或目标资源。

      • 在 Web 资源被访问后,检查 response 对象,修改响应头和响应正文。

    关键点:

    • 过滤器可以自行对请求进行处理,并发送响应给客户端

    • 也可以将请求转发或重定向到其他的 Web 资源

    Filter的作用:

    服务器管理的所有 Web 资源(例如 JSP、Servlet、静态 HTML 文件、静态图片等)进行拦截,实现用户的权限控制、过滤敏感词、设置统一编码格式等功能。

    Filter接口

    规范:

    • 开发过滤器要实现 javax.servlet.Filter 接口

    • 提供一个公开的不带参的构造方法

    Filter接口当中的3个方法:

    返回值类型方法功能描述
    void init (FilterConfig filterConfig) 该方法用于初始化过滤器。
    void doFilter(ServletRequest request,SeivletResponse response, FilterChain chain) 该方法完成实际的过滤操作,当客户端请求的 URL 与过滤器映射的 URL 匹配时,容器会先调用该方法对请求进行拦截。 参数 request 和 response 表示请求和响应对象。 参数 chain 代表当前 Filter 链对象,在该方法内部,调用 chain.doFilter() 方法,才能把请求交付给 Filter 链中的下一个 Filter 或者 Web 资源。
    void destroy() 该方法在销毁 Filter 对象之前被调用,用于释放被 Filter 对象占用的资源。

    Filter工作流程

    流程图: 

     

    产生过程:

    • 在Servlet容器创建了requestresponse对象之后会调用Filter当中的doFilter()方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。

    • 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。

    • 生成response对象以后回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。

    • 返回响应信息给客户端

    Filter的生命周期

    • 初始化阶段

    • 拦截和过滤阶段

    • 销毁阶段


    初始化阶段
    • Servlet 容器负责加载和实例化 Filter。容器启动时,读取 web.xml 或 @WebFilter 的配置信息对所有的过滤器进行加载和实例化。

    • 加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Filter 实例。在 Filter 的生命周期内, init() 方法只执行一次。

    拦截和过滤阶段
    • 客户端请求访问 Web 资源时,Servlet 容器会根据 web.xml 或 @WebFilter 的过滤规则进行检查

    • 客户端请求的 URL 与过滤器映射匹配时,容器将该请求的 request 对象、response 对象以及 FilterChain 对象以参数的形式传递给 Filter 的 doFilter() 方法,并调用该方法对请求/响应进行拦截和过滤。

    销毁阶段
    • Filter 对象创建后会驻留在内存中,直到容器关闭或应用被移除时销毁。

    • 销毁 Filter 对象之前,容器会先调用 destory() 方法,释放过滤器占用的资源。

    • 在 Filter 的生命周期内,destory() 只执行一次。

    概括:

    • Filter对象再init方法调用前产生,再configContext对象产后产生

    • Filter对象再destory方法调用后销毁

    注册与映射Filter

    • 配置web.xml

    • 配置@WebFilter注解


    web.xml
    1. Filter元素

    2. Filter-Mapping元素

    <filter>示例:

    <filter>
       <filter-name>myFilter</filter-name>
       <filter-class>net.biancheng.www.MyFilter</filter-class>
       <init-param>
           <param-name>name</param-name>
           <param-value>JunkingBoy</param-value>
       </init-param>
       <init-param>
           <param-name>URL</param-name>
           <param-value>www.Jun.com</param-value>
       </init-param>
    </filter>
    <!--
    <init-param> 是<filter> 元素的子元素,用于为过滤器指定初始化参数,它的子元素 <param-name> 指定参数的名称,<param-value> 指定参数的值。
    -->

    <filter-mapping>示例:

    <filter-mapping>
       <filter-name>myFilter</filter-name>
       <url-pattern>/login</url-pattern>
       <dispatcher>REQUEST</dispatcher>
       <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    <filter-mapping>
       <filter-name>myFilter</filter-name>
       <servlet-name>ServletDemo</servlet-name>
    </filter-mapping>

    <dispatcher>元素的作用:

    • 指定 Filter 拦截的资源被 Servlet 容器调用的方式,可以是 REQUEST、INCLUDE、FORWARD 和 ERROR 之一,默认 REQUEST。

    • 用户可以设置多个 <dispatcher> 子元素指定 Filter 对资源的多种调用方式进行拦截。

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

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

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

      • ERROR:如果目标资源通过声明式异常处理机制访问,则该过滤器将被调用。除此之外,过滤器不会被调用。

    @WebFilter注解
    • 容器在部署应用时,会根据其具体属性配置将相应的类部署为过滤器

    @WebFilter注解使用注意事项:

    • value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值。

    属性名类型描述
    filterName String 指定过滤器的 name 属性,等价于 <filter-name>
    urlPatterns String[] 指定过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。
    value String[] 该属性等价于 urlPatterns 属性,但是两者不能同时使用。
    servletNames String[] 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中 filterName 属性的取值,或者 web.xml 中 <servlet-name> 的取值。
    dispatcherTypes DispatcherType 指定过滤器拦截的资源被 Servlet 容器调用的方式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
    initParams WebInitParam[] 指定一组过滤器初始化参数,等价于 <init-param> 标签。
    asyncSupported boolean 声明过滤器是否支持异步操作模式,等价于 <async-supported> 标签。--->非常关键
    description String 指定过滤器的描述信息,等价于 <description> 标签。
    displayName String 指定过滤器的显示名,等价于 <display-name> 标签。

    注解配置过滤器示例:

    package com.example.HttpServletRequestDemo;

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    import java.io.IOException;

    /**
    * 使用过滤器Filter接口当中的方法
    * @since JDK 1.8
    * @date 2021/09/20
    * @author Lucifer
    */
    @WebFilter(
           dispatcherTypes = {
                   DispatcherType.REQUEST,
                   DispatcherType.FORWARD,
                   DispatcherType.INCLUDE,
                   DispatcherType.ERROR
          },
           asyncSupported = true,
           description = "过滤器4",
           urlPatterns = {"/login"},
           initParams = {
                   @WebInitParam(name = "name", value = "Jun", description = "Jun的长相描述")
          },
           servletNames = {"SuccessServlet"}
    )
    public class MyFilter implements Filter {
       //重写doFilter方法
       @Override
       public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
      }
    }

     

    It's a lonely road!!!
  • 相关阅读:
    react-project(二)
    JS--轻松设置获取表单数据
    C#基础---Queue(队列)的应用
    C#基础---Attribute(标签) 和 reflect(反射) 应用二
    C#基础---Attribute(标签) 和 reflect(反射) 应用
    基于Cordova的博客园三方App
    Vue站点的搭建之旅
    移动端浏览器问题汇总
    C#基础---浅谈XML读取以及简单的ORM实现
    WebSite---前台系统图片验证码心得
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15315076.html
Copyright © 2011-2022 走看看