問題1: 我們知道,當一個類加載器將要加載一個類時,將請求委託給它的父類加載器。但是,在Tomcat中,它不會:您可以加載您的類來覆蓋放在公共lib目錄中的相同名稱類。這意味着Tomcat
WebappClassloader
不遵循授權政策。這是否違反慣例?Tomcat的類加載器違反了委託的政策問題2: 我寫了一個類,把它放在常用的lib目錄下,顯然這個類是在web應用程序之間共享的。例如,每個Web應用程序都可以讀取/寫入該類的靜態字段。此外,JDK中的類由Bootstrap類加載器加載,然後它們的靜態字段由任何Web應用程序共享,是否危險?
4
A
回答
6
此行爲是故意的,它允許您在每個WAR中獨立重寫Tomcat本身提供的庫。例如,您可以爲每個部署到容器的應用程序使用不同版本的Log4J,而不會引入任何問題或打破其他應用程序。從Tomcat documentation:
像許多服務器應用程序,Tomcat的安裝各種各樣的類加載器[...]以允許容器的不同部分,並且容器上運行的Web應用程序,以訪問到可用類別和資源的不同存儲庫。該機制用於提供Servlet規範2.4版中定義的功能 - 特別是第9.4節和第9.6節。
它確實違反了正常的委託算法,但這也是其他應用服務器的工作方式(例如JBoss)。
Ad。問題2:是的,這是危險的,你必須記住關於同步並且不能控制誰修改這個變量。我會完全避免static
字段。
例如EhCache允許你分享CacheManager
。這是通過net.sf.ehcache.CacheManager#singleton
static volatile
字段實施的。現在您遇到了各種問題:如果您將ehcache.jar
放入Tomcat的/lib
中,它將按預期工作。但是,如果每個Web應用程序都有自己的JAR文件副本,則共享將無法工作,因爲每個Web應用程序都有自己的CacheManager
類副本。當只有一個應用程序擁有自己的ehcache.jar
時,它會變得更糟 - 所有應用程序將共享相同的CachedManager
實例,但將ehcache.jar
打包在一起。這種錯誤很難追查到......
相關問題
- 1. 違反suexec政策
- 2. 尋找違反StrictMode政策
- 3. snap.com快照違反相同的政策?
- 4. C#:延遲加載,委託類,反射
- 5. 違反內容安全政策
- 6. 違反了同源策略?
- 7. Chrome擴展程序違反了Google安全政策
- 8. 手託政策
- 9. Websphere類加載器委託模式
- 10. 是否違反Admob政策來加載廣告並將其隱藏
- 11. 如何檢查應用程序違反了谷歌的冒充政策或不
- 12. 在簡單的網站上違反了內容安全政策指令
- 13. Chrome瀏覽器不會加載政策
- 14. 谷歌Play應用被拒絕違反危險品政策
- 15. 找出違反pthread親和力政策,然後Linux內核2.6.32
- 16. WAS 7.0 JVMVRFY013類加載約束違反
- 17. 的jboss-4.0.3SP1 LinkageError類加載器約束違反
- 18. StrictMode政策違規:StrictModeDiskReadViolation,WriteViolation在Android中
- 19. API開關觸發StrictMode政策違規
- 20. 「Microsoft.Online.SharePoint.TenantAdministration.SpoOperation」違反了類型參數「T」的
- 21. UIImage Gif加載委託?
- 22. 通過委託加載DataGridView
- 23. UIWebView不加載委託
- 24. 委託或反思?
- 25. 我的委託不火的NSXMLParser加載
- 26. mkMapView的regionDidChangeAnimated委託觸發了兩次標籤加載
- 27. 當我嘗試包含角色名稱時,政策中的委託人無效
- 28. 違反Google Play開發者政策的警告:需要採取措施
- 29. 違反Google Play開發者政策的警告:需要採取措施
- 30. 如何與委託人一起構造PrincipalPermission以授權違反該委託人的帳戶?
感謝您的回答!是的,每個應用服務器都應該「違反」授權算法。 –
看到我的更新,回答你的第二個問題。 –