我们说管道机制给我们带来了更好的扩展性,Tomcat中在扩展性方面具体如何体现,这便是本节讨论的内容。从上节了解到基础阀门是必须执行的,假如你需要一个额外的逻辑处理阀门,可以添加一个非基础阀门。

我的需求是对每个请求访问进行IP记录,打印到日志里面,详细操作如下:

① 自定义一个阀门PrintIPValve,只要继承ValveBase并重写invoke方法即可,ValveBase是Tomcat抽象的一个基础类,它帮我们实现了生命接口及MBean接口,使我们只需专注阀门的逻辑处理即可。需要注意的地方是一定要执行调用下一个阀门操作,即执行getNext().invoke(request,response),否则运行时将出现错误,请求到这个阀门就停止往下处理。

public classPrintIPValve extends ValveBase{

@Override

publicvoid invoke(Request request, Response response) throws IOException,

ServletException{

System.out.println(request.getRemoteAddr());

               getNext().invoke(request,response);

}

}

② 配置tomcat服务器配置server.xml,这里把阀门配到Engine容器下,这样作用范围即在整个引擎,你也可以根据作用范围配置Host或Context下。

<Server port="8005"shutdown="SHUTDOWN">

……

<Engine name="Catalina"defaultHost="localhost">

<ValveclassName="org.apache.catalina.valves.PrintIPValve" />

……

</Engine>

……

</Server>

③ 将PrintIPValve类编译成.class文件,可以导出一个jar包放入tomcat安装目录lib目录下,也可直接将.class文件放入tomcat官方包catalina.jar中,这里的包名为org.apache.catalina.valves。

经过上面三个步骤配置好阀门,启动tomcat后对其进行的任何请求访问的客户端的IP都将被记录到日志中。除了自定义阀门以外,tomcat的开发者也十分友好,为我们提供了很多常用的阀门,对于这些阀门我们就无需再自定编写阀门类,要做的仅仅是在server.xml中配置即可生效。

l  AccessLogValve,请求访问日志阀门,通过此阀门可以记录所有客户端的访问日志,包括远程主机IP、远程主机名、请求方法、请求协议、会话id、请求时间、处理时长、数据包大小等等。它提供了任意参数化的配置,可以通过任意组合来定制你的访问日志格式。

l  JDBCAccessLogValve,同样是记录访问日志的阀门,但此类帮助将访问日志通过jdbc持久化到数据库中。

l  ErrorReportValve,这是一个将错误以html格式输出的阀门。

l  PersistentValve,这是对每个请求的会话实现持久化的阀门。

l  RemoteAddrValve,这是一个访问控制阀门,通过配置可以决定哪些ip可以访问web应用。

l  RemoteHostValve,这也是一个访问控制阀门,与RemoteAddrValve不同的是它是通过主机名限制访问者。

l  RemoteIPValve,这是一个针对代理或负载均衡处理的一个阀门,一般经过代理或负载均衡转发的请求都将自己的IP添加到请求头部"X-Forwarded-For"中,此时可以通过此阀门可以获取访问者真实的IP。

l  SemaphoreValve,这是一个控制容器上并发访问的阀门,可以作用在不同容器上。例如放在Context则整个上下文只允许若干线程同时访问,并发数量可以自己配置。

在实际的使用过程中,如果你需要的阀门tomcat已经帮你写好,则只需要对配置文件进行配置即可生效,如果无法满足自己需求的话则可以通过自己定义一个阀门。

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

Tomcat中定制阀门的更多相关文章

  1. CAS 在 Tomcat 中实现单点登录

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统 中,用户只需要登录一次就可以访问所有相互信任的应用系统.CA ...

  2. 【IBM】使用 CAS 在 Tomcat 中实现单点登录

    来源: IBM Developer http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/ 张 涛 (zzhangt@cn.ibm.com ...

  3. 使用 CAS 在 Tomcat 中实现单点登录

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.CAS ...

  4. Tomcat中Listener的使用范例(转载http://cywhoyi.iteye.com/blog/2075848)

    Tomcat是非常有名的开源容器,因其开源我们可以对其做定制化的改变,而且Tomcat在其配置文件方面做了很多注释说明摘要,帮助我们更好的定制化我们所需的功能点. New Tomcat Listene ...

  5. 在Tomcat中采用基于表单的安全验证

    .概述   (1)基于表单的验证 基于From的安全认证可以通过TomcatServer对Form表单中所提供的数据进行验证,基于表单的验证使系统开发者可以自定义用户的登陆页面和报错页面.这种验证方法 ...

  6. tomcat中Servlet的工作机制

    在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法 ...

  7. Tomcat中Pipeline

    Pipeline 节选部分源码.源码版本 Tomcat8.5 处理模式 Pipeline--Valve是一种责任链模式,它和普通责任链模式有两点区别: 每个Pipeline都是有特定的Valve,而且 ...

  8. Tomcat中日志组件

    Tomcat日志组件 AccessLog接口 public interface AccessLog { public void log(Request request, Response respon ...

  9. (8) tomcat中管理领域、角色及用户

    srverlet Container或web应用程序本身都可以提供控制web应用程序资源的安全防护 前者称为容器管理的安全防护,或者称为应用程序管理安全防护 通过内嵌机制,tomcat提供一些安全防护 ...

随机推荐

  1. WMI远程启动软件(某个应用程序)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.M ...

  2. 使用ffmpeg转码时遇到aac报错

    今天尝试用ffmpeg转一个视频的格式,结果报出这个错误: The encoder 'aac' is experimental but experimental codecs are not enab ...

  3. scan函数用法详解

    scan函数: scan(s,n,"char")表示从字串string中以char为分隔符提取第n个字串 功能(function):从字符表达式s中搜取给定的n个单词语法(synt ...

  4. delphi 组件安装教程详解

    学习安装组件的最好方法,就是自己编写一个组件并安装一遍,然后就真正明白其中的原理了.   本例,编写了两个BPL, dclSimpleEdit.bpl 与 SimpleLabel.bpl ,其中,dc ...

  5. Clojure新手入门

    官方网站 clojure.org 环境安装 Java(JDK) Leiningen 编辑工具 Eclipse插件 -- Counterclockwise IntelliJ插件 -- Cursive E ...

  6. 安卓高级EventBus使用详解

    我本来想写但是在网上看了下感觉写得不如此作者写得好:http://www.jianshu.com/p/da9e193e8b03 前言:EventBus出来已经有一段时间了,github上面也有很多开源 ...

  7. 快速排序quick_sort(python的两种实现方式)

    排序算法有很多,目前最好的是quick_sort:unstable,spatial complexity is nlogN. 快速排序原理 python实现 严蔚敏的 datastruct书中有伪代码 ...

  8. Dynamics CRM2016 查询数据的三种方式的性能对比

    之前写过一个博客,对非声明验证方式下连接组织服务的两种方式的性能进行了对比,但当时只是对比了实例化组织服务的时间,并没有对查询数据的时间进行对比,那有朋友也在我的博客中留言了反映了查询的时间问题,一直 ...

  9. 详解EBS接口开发之应收INVOICE导入

    (一)应收INVOICE常用标准表简介 1.1   常用标准表 如下表中列出了与应收INVOICE导入相关的表和说明: 表名 说明 其他信息 RA_BATCH_SOURCES_ALL AR事务处理来源 ...

  10. Android Stutio中使用java8的Lambda表达式

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51532028 本文出自:[openXu的博客] 目录: 为什么要使用Lambda表达式 让A ...