日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
啥,Tomcat里竟然還有特權(quán)應(yīng)用?

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

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、鶴崗ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的鶴崗網(wǎng)站制作公司

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 
 
 
 

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

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

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

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

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

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

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

在loadClassMaybePrivileged中,對(duì)于catalina包中的 class,會(huì)使用ServerClassLoader 來進(jìn)行加載,除了通過不同的classLoader加載外,還會(huì)進(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. }
  17. // 這里檢查配置文件中的內(nèi)容
  18. private void checkAccess(Class clazz, Properties restricted) {
  19.     while (clazz != null) {
  20.         if ("restricted".equals(restricted.getProperty(clazz.getName()))) {
  21.             throw new SecurityException("Restricted " + clazz);
  22.         }
  23.         clazzclazz = clazz.getSuperclass();
  24.     }
  25. }

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

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

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

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


網(wǎng)站題目:啥,Tomcat里竟然還有特權(quán)應(yīng)用?
網(wǎng)站地址:http://www.5511xx.com/article/cosgodj.html