我們說管道機制給我們帶來了更好的擴充性,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已經幫你寫好,則隻需要對配置檔案進行配置即可生效,如果無法滿足自己需求的話則可以通過自己定義一個閥門。
<a target="_blank" href="https://item.jd.com/12185360.html">點選訂購作者《Tomcat核心設計剖析》</a>