Servlet 之 Filter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet 之 Filter相关的知识,希望对你有一定的参考价值。

参考技术A 原文地址: https://wyiyi.github.io/amber/2021/10/01/filter/

description: "Filter 不仅能前置处理 Request,也能后置处理 Response,不过后置处理时,要注意 Response 一旦被提交了,就不能再被修改了"
date: 2021.10.17 10:34
categories:
- Java
tags: [Servlet]
keywords: Servlet, filter, response is commited

原文地址: https://wyiyi.github.io/amber/2021/10/01/filter/

Servlet 作为Java Web 的基础,在 Servlet API 中提供了一个 Filter 接口,Filter,又称过滤器。
所谓过滤器顾名思义是用来过滤的,可以从客户端向服务端发送请求进行过滤,也可以对服务器返回响应进行处理。

根据上面的流程可以看出,Filter的作用就是在用户请求到达Servlet之前,进行拦截。在拦截到用户的请求后,我们可以实现一些自定义的业务逻辑。
例如:实现URL级别的权限访问控制(最常用)、字符编码、登录限制、过滤敏感词汇、文件压缩,跨域设置等一些高级功能。

Filter 与 Servlet 一样都是由服务器负责创建和销毁的,Filter 只会被创建和销毁一次,doFilter 可以执行多次。

将 Java 类实现 javax.servlet.Filter 接口,重写 doFilter() 方法(init(),destroy() 也可重写)

1、通过传统的 web.xml 方式注册。

2、注解方式: @WebFilter,该方式是 web3.0 提供的注解,代替在 web.xml 文件中配置 filter,简化了开发。

1、在 chain.doFilter 中使用 @WebFilter 注解,会按照类名的字典顺序执行

以 AFilter 、 BFilter 、 CFilter 为例,执行的过滤器的顺序输出为:

2、调整 FilterChain 的执行顺序

由于注解 @WebFilter 的源码(如下)中没有参数指定顺序,但是在Spring中提供了 @Order 注解可以指定Filter的执行顺序。

执行的过滤器的顺序输出为:

3、设置请求或响应(Request、Response)

【注意】: Filter chain.doFilter 之后 response is committed,不能再设置请求头
,原因是当响应被提交时,这意味着标头已经发送到客户端,无法设置或者更改标头。

Filter的用法之注解

一、filter的概念及功能

      Filter就像用滤纸来过滤杂物一样,它也叫过滤器。过滤器是Servlet2.3之后新增加的功能,它可以更变一个request请求也可以修改一个response。它可以在request到达Servlet之前预处理request,他也可以在response离开Servlet时处理response,总之,可以叫他Servlet链。一般作用在一下方面:

    1.在request到达Servlet之前:    

        1)对用户的请求统一的认证;

        2)编码的转换;

        3)对用户发过来的数据进行替换,也可以进行加密行为等。

   2.在response离开Servlet之后:

       1)修改response的头及数据等。

二、代码实现

     首先要实现 javax.servlet.Filter接口以及三个方法:

      1. init(FilterConfig filterConfig)-->初始化过滤器多用于获取初始化参数。

      2.doFilter(ServletRequest servletRequest , ServletResponse servletResponse , FilterChain  chain )-->过           滤处理的相关操作都在这里完成,需要调chain.doFilter(servletRequest ,servletResponse )方法,把请求继续向             后传递,可以是对下一个过滤器doFilter方法的调用,或者相应的web组件。所以Filter采用了职责链设计模式。

      3.destroy() 过滤器销毁  Servlet容器在销毁过滤器实例之前该方法得到调用,以释放占用的资源。

     最后编码的实现:

      对用户的请求统一的认证,获取用户名,如果用户名为空,则调到登录界面,否则放行。

技术分享

技术分享

@webFilter里相关属性的介绍:

     属性名                      类型                                      描述

  filterName                  String              指定过滤器的name属性,等价于<filter-name>

     value                     String[]            该属性等价于urlPatterns属性,两者不能同时使用

    urlPatterns              String[]            指定过滤器的URL匹配模式,等价于<url-pattern>

   servletNames          String[]            指定过滤器将应用到哪些Servlet。取值是@WebServlet的name属性或者<servlet-name>的值

   dispatcherTypes      DispatcherType  指定过滤器的转发模式,取值有:ASYNC ERROR FORWARD INCLUDE REQUEST

   initParams             WebInitParam[]   指定一组过滤器初始化参数,等价于<init-Param>

   asyncSupported    boolean              指定过滤器是否支持异步操作模式,等价于<async-supported>

   description            String                 该过滤器的描述信息,等价于<description>

  displayName           String                该过滤器的显示名,通常配合工具使用,等价于<display-name>


以上是关于Servlet 之 Filter的主要内容,如果未能解决你的问题,请参考以下文章

web.xml 中的listener filterservlet 加载顺序及其详解

web.xml 中的listener filterservlet 加载顺序及其详解

(转)web.xml 中的listener filterservlet 加载顺序及其详解

Filter过滤器

Filter与Servlet的区别和联系

java 登录拦截器