自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

啥,Tomcat里竟然還有特權(quán)應(yīng)用?

開發(fā) 開發(fā)工具
在Tomcat部署的應(yīng)用里,我們一般意義上都是指普通的應(yīng)用,但對于一些特殊的應(yīng)用,需要執(zhí)行一些特別的操作,這就是我們今天提到的 Tomcat 內(nèi)的特權(quán)應(yīng)用(privileged app)。

在 Tomcat 部署的應(yīng)用里,我們一般意義上都是指普通的應(yīng)用,大家可以執(zhí)行的操作等都是一樣的,一條起跑線上的,沒有區(qū)別。

但對于一些特殊的應(yīng)用,需要執(zhí)行一些特別的操作,比如官方默認(rèn)提供的 manager應(yīng)用,可以進(jìn)行應(yīng)用的啟動、停止、部署等一系列操作。這些操作的背后,是 Tomcat默認(rèn)包含的 ManagerServlet 實現(xiàn)的, manager 應(yīng)用實現(xiàn)的,是對于該 Servelet 的調(diào)用。

那我們自己寫一個應(yīng)用去調(diào)用這個 ManagerServlet 不也一樣可以嗎?

答案是不行的,至少直接操作不行,需要配置。這里就是我們今天提到的 Tomcat 內(nèi)的特權(quán)應(yīng)用(privileged app)。

manager 應(yīng)用就是自帶的一個特權(quán)應(yīng)用,因此它可以直接調(diào)用 ManagerServlet 進(jìn)行一些容器內(nèi)部的操作。

我們單獨部署的其他應(yīng)用,就會被限制調(diào)用這些容器提供的內(nèi)部組件,比如一些 Servlet、Filter、Listener。

這些限制資源進(jìn)行檢查時,分為兩種類型。

1. 一類是通過類型來進(jìn)行判斷,比如 Servlet 中,ManagerServlet、HTMLManagerServlet 這些都被稱為ContainerServlet。實現(xiàn)了相同的接口。

2. 還有一類是在配置文件中指定的,有三個文件:

  • RestrictedFilters.properties
  • RestrictedListeners.properties
  • RestrictedServlets.properties

位于 org.apache.catalina.core 包中。

這些內(nèi)部在 DefaultInstanceManager 初始化時進(jìn)行解析,例如 servlet的內(nèi)容解析后是這些:

 servlet的內(nèi)容解析

這些內(nèi)容也是容器提供的一些功能的實現(xiàn),比如 GCI 請求處理, JMXProxyServlet 會將 JMX 的屬性 dump 出來等等。

特權(quán)應(yīng)用的配置

那怎樣能讓單獨開發(fā)的應(yīng)用成為特權(quán)應(yīng)用,能調(diào)用這些容器的功能呢?

之前的文章介紹過應(yīng)用的部署描述文件context.xml ( Tomcat目錄部署與Context描述文件context.xml),這次我們的升級特權(quán)操作也是需要在這里進(jìn)行。

具體來說,在應(yīng)用部署時,將應(yīng)用的 Context 對象中 privileged屬性設(shè)置為 true。例如 manager 應(yīng)用的配置是這樣的,文件位于于 manager 的META-INF 目錄中,單獨開發(fā)時可以參考:

  1. <Context antiResourceLocking="false" privileged="true" > 

這樣配置之后,在應(yīng)用部署時就會將代表應(yīng)用的 StandardContext 對象中 privileged 屬性設(shè)置為true,后面會讀取使用。

特權(quán)應(yīng)用的工作原理

應(yīng)用在啟動時,會將 DefaultInstanceManager 做為其 instanceManager。該屬性在后面 Servlet、Filter、Listener 這些組件加載時使用,做為實例管理器,進(jìn)行 newInstance的管理。

以 Servlet 為例,有些 loadOnStartup 的 Servlet,會在部署啟動應(yīng)用時直接生成實例。

在 loadServlet 階段時,會先通過 Wrapper 獲取父容器 Context 的 instanceManager,再通過 instanceManager 來加載具體的 Servlet class。

以下為 instanceManager 進(jìn)行 newInstace 時的邏輯

  1. public Object newInstance(String className)  { 
  2.        Class<?> clazz = loadClassMaybePrivileged(className, classLoader); 
  3.         return newInstance(clazz.newInstance(), clazz); 
  4.     } 

在loadClassMaybePrivileged中,對于catalina包中的 class,會使用ServerClassLoader 來進(jìn)行加載,除了通過不同的classLoader加載外,還會進(jìn)行上面說的 privileged 檢查。

  1. private void checkAccess(Class<?> clazz) { 
  2.     if (privileged) { 
  3.         return; 
  4.     } 
  5.     if (Filter.class.isAssignableFrom(clazz)) { 
  6.         checkAccess(clazz, restrictedFilters); 
  7.     } else if (Servlet.class.isAssignableFrom(clazz)) { 
  8.         if (ContainerServlet.class.isAssignableFrom(clazz)) { 
  9.             throw new SecurityException("Restricted (ContainerServlet) " + 
  10.                     clazz); 
  11.         } 
  12.         checkAccess(clazz, restrictedServlets); 
  13.     } else { 
  14.         checkAccess(clazz, restrictedListeners); 
  15.     } 
  16. // 這里檢查配置文件中的內(nèi)容 
  17. private void checkAccess(Class<?> clazz, Properties restricted) { 
  18.     while (clazz != null) { 
  19.         if ("restricted".equals(restricted.getProperty(clazz.getName()))) { 
  20.             throw new SecurityException("Restricted " + clazz); 
  21.         } 
  22.         clazzclazz = clazz.getSuperclass(); 
  23.     } 

對于 priviledged 應(yīng)用,之后的 checkAccess 就直接跳過,否則會判斷是否是 ContainerServlet,是否在配置文件中進(jìn)行限制等,只有都檢查通過才可以進(jìn)行 使用。

例如 普通的應(yīng)用在使用HTMLManagerServlet ,此時由于限制檢查,會提示500。

 

所以,之后有需要使用容器提供的功能時,可以將應(yīng)用升級為特權(quán)應(yīng)用,然后調(diào)用容器提供的高級功能。

【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『Tomcat那些事兒』獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2010-03-04 15:38:01

2020-06-17 07:56:19

前端存儲數(shù)據(jù)

2024-10-09 09:07:10

JVM優(yōu)化String類JDK1.6

2009-07-02 17:59:51

2021-07-26 06:57:59

Synchronize線程安全

2019-07-01 10:48:13

Tomcat中間件TPM

2019-06-14 08:48:46

Tomcat日志SpringBoot

2021-03-05 18:36:59

日志Jar包代碼

2020-10-16 09:09:56

代碼業(yè)務(wù)模型

2017-03-01 11:15:43

LinuxKali LinuxSSH服務(wù)

2021-05-06 07:00:28

Excel數(shù)據(jù)技巧

2021-03-04 09:50:23

Redis網(wǎng)絡(luò)通信Redis服務(wù)器

2023-02-15 11:58:29

2021-04-16 20:47:42

Go 指令函數(shù)

2020-09-23 16:05:42

Python手繪圖表編程語言

2014-12-09 14:38:15

JavaScript6

2019-07-15 15:45:00

5.0Gs PCIe 4.0

2017-12-28 10:27:28

2018-03-08 10:24:48

Redis運維 RDR

2012-11-08 10:15:05

點贊
收藏

51CTO技術(shù)棧公眾號