JavaWeb-Tomcat阀

Filter的功能之一就是预处理客户请求,而 Tomcat阀是对 Catalina容器接收到的 HTTP请求进行预处理.

过滤器实在 Servlet规范中提出来的,因此适用于所有的 Servlet容器,而 Tomcat阀是 Tomcat转悠的,不能用于 Tomcat以外的其他 Servlet容器.

阀可以加入到3种容器中: <engine></engine>/ <host></host><context></context>.

所有的阀都实现了 org.apache.catalina.Valve,它有如下几个方法:

    public Valve getNext();
    public void setNext(Valve valve);
    public void backgroundProcess();
    public void invoke(Request request, Response response)
        throws IOException, ServletException;
    public boolean isAsyncSupported();

其中最重要的是 invoke(),它的官方 JavaDoc描述如下:

根据该阀门的要求执行请求处理。
单个Valve可以按指定顺序执行以下操作:

  1. 检查或修改指定的请求和响应的属性。
  2. 检查指定 Request的属性,完全生成相应的 Response,并将控制权返回给调用者。
  3. 检查指定的请求和响应的属性,包装这两个对象中的一个或两个,以补充其功能,然后将其传递。
  4. 如果未生成相应的 Response(并且未返回控件),请通过执行 getNext()invoke()来调用管道中的下一个 Valve(如果存在):
getNext().invoke(request, response);
  1. 检查但不修改最终响应的属性(该响应是由随后调用的 ValveContainer创建的)。

阀门绝对不能做以下任何事情:

  1. 更改已经用于指导此请求的处理控制流程的请求属性(例如,尝试更改标准实施中应从连接到主机或上下文的管道将请求发送到的虚拟主机)。
  2. 创建完成的响应并将此请求和响应传递到管道中的下一个阀门。
  3. 除非与请求完全相关联,否则请消耗与请求相关联的输入流中的字节,除非它完全生成了响应,或者在传递请求之前将其包装。
  4. getNext()invoke()方法返回后,修改 Response包含的 HTTP标头。
  5. getNext()invoke()方法返回后,对与指定的 Response关联的输出流执行任何操作。

<valve></valve>的基本表示形式是:


这里所列的 &#x5176;&#x4ED6;&#x5C5E;&#x6027;根据具体的 Valve实现类而定,它定义了哪些成员变量这里就可以对应设置属性,不过都是简单类型,比如字符串或数字等.

常用内置阀:

  • 客户访问日志阀,这个是默认开启的,在 server.xml/<server><context></context></server>中,会生成访问日志,位置在 $CATALINA_HOME/logs文件夹下
  • 远程地址过滤器, 定义哪些地址可以访问,哪些予以禁止
  • 远程主机过滤器, 定义哪些主机可以访问,哪些予以禁止
  • 客户请求记录器

若要使得阀门生效,需要将其放在合适的位置上.不同的位置代表不同的作用域.根据作用范围从大到小排列:

最常见的是第3种情况,可以根据项目需要自定义阀.

其次是第2种情况,比如默认开启的客户访问日志阀(`AccessLogValve)就定义在这个位置.

第1种不太常用,不过视情况而定.

自定义阀需要满足几个条件:

Original: https://www.cnblogs.com/yw0219/p/12683302.html
Author: 舒山
Title: JavaWeb-Tomcat阀

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537887/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球