gpt4 book ai didi

java - tomcat8.0 和 tomcat8.5.6 WebappClassLoaderBase

转载 作者:行者123 更新时间:2023-11-28 22:16:48 27 4
gpt4 key购买 nike

我们最近将 tomcat 从 8.0.32 更新到 8.5.6,在尝试加载 /opt/apache-tomcat-8.5.6_1/webapps/example/时遇到了 AccessControlException WEB-INF/classes/com/sun/xml/internal/ws/runtime/config/jaxb.properties,我在tomcat 8.5.6和8.0.32之间调试源码,在中不一样org.apache.catalina.loader.WebappClassLoaderBase.findResource

Tomcat8.0

public URL findResource(final String name) {

if (log.isDebugEnabled())
log.debug(" findResource(" + name + ")");

checkStateForResourceLoading(name);

URL url = null;

String path = nameToPath(name);

ResourceEntry entry = resourceEntries.get(path);
if (entry == null) {
if (securityManager != null) {
PrivilegedAction<ResourceEntry> dp =
new PrivilegedFindResourceByName(name, path);
entry = AccessController.doPrivileged(dp);
} else {
entry = findResourceInternal(name, path);
}
}
if (entry != null) {
url = entry.source;
entry.webResource = null;
}

if ((url == null) && hasExternalRepositories) {
url = super.findResource(name);
}

if (log.isDebugEnabled()) {
if (url != null)
log.debug(" --> Returning '" + url.toString() + "'");
else
log.debug(" --> Resource not found, returning null");
}
return url;
}

Tomcat8.5.6

public URL findResource(final String name) {

if (log.isDebugEnabled())
log.debug(" findResource(" + name + ")");

checkStateForResourceLoading(name);

URL url = null;

String path = nameToPath(name);

WebResource resource = resources.getClassLoaderResource(path);
if (resource.exists()) {
url = resource.getURL();
trackLastModified(path, resource);
}

if ((url == null) && hasExternalRepositories) {
url = super.findResource(name);
}

if (log.isDebugEnabled()) {
if (url != null)
log.debug(" --> Returning '" + url.toString() + "'");
else
log.debug(" --> Resource not found, returning null");
}
return url;
}

如你所见,tomcat8.0通过AccessController.doPrivileged加载资源,但在tomcat8.5.6中,它直接加载资源,我想这就是我得到异常的原因

java.security.AccessControlException: access denied 
("java.io.FilePermission"
"/opt/apache-tomcat-8.5.6_1/webapps/example/WEB-INF/classes/com/sun/xml/internal/ws/runtime/config/jaxb.properties"
"read")

java.lang.IllegalStateException: MASM0003: Default [ jaxws-tubes-default.xml ] configuration file was not loaded
at com.sun.xml.internal.ws.assembler.MetroConfigLoader.init(MetroConfigLoader.java:133)
at com.sun.xml.internal.ws.assembler.MetroConfigLoader.<init>(MetroConfigLoader.java:104)

此文件由MetroConfigLoader加载,

private static JAXBContext createJAXBContext() throws Exception {
return isJDKInternal()?(JAXBContext)AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() {
public JAXBContext run() throws Exception {
return JAXBContext.newInstance(MetroConfig.class.getPackage().getName());
}
}, createSecurityContext()):JAXBContext.newInstance(MetroConfig.class.getPackage().getName());
}

private static AccessControlContext createSecurityContext() {
PermissionCollection perms = new Permissions();
perms.add(new RuntimePermission("accessClassInPackage.com.sun.xml.internal.ws.runtime.config"));
perms.add(new ReflectPermission("suppressAccessChecks"));
return new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain((CodeSource)null, perms)});
}

有没有人遇到同样的问题?或者还有其他一些问题。谢谢。

最佳答案

经过三天的研究,现在我使用 jaxws-rt 而不是 JDK 中的默认实现,正如您可以从 JDK 中的代码中读取的那样:

private static JAXBContext createJAXBContext() throws Exception {
return isJDKInternal()?(JAXBContext)AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() {
public JAXBContext run() throws Exception {
return JAXBContext.newInstance(MetroConfig.class.getPackage().getName());
}
}, createSecurityContext()):JAXBContext.newInstance(MetroConfig.class.getPackage().getName());
}

如果是JDK内部,会创建特定权限的实例,而tomcat在tomcat8.0中是通过doPrivileged获取资源的,而在tomcat8.5中就不一样了,没有权限就获取不到资源

java.security.AccessControlException: access denied ("java.io.FilePermission" 
"/opt/apache-tomcat-8.5.6_1/webapps/example/WEB-INF/classes/com/sun/xml/internal/ws/runtime/config/jaxb.properties"
"read")

所以我改成外部jaxws-rt,它会直接创建实例。我只是将 jaxws-rt 添加到 pom。

 <dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.2.10</version>
</dependency>

关于java - tomcat8.0 和 tomcat8.5.6 WebappClassLoaderBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44212443/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com