gpt4 book ai didi

classloader - Jetty-7.1.6.v20100715中获取X509Certificate时抛出ClassCastException

转载 作者:行者123 更新时间:2023-12-02 07:49:57 25 4
gpt4 key购买 nike

我写的过滤器抛出ClassCastException

[Ljava.security.cert.X509Certificate;无法转换为 java.security.cert.X509Certificate

当我尝试转换从 ServletRequest 属性中提取的对象时,即

public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws
IOException, ServletException
{
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate");
System.out.println("cert dn " + cert.getSubjectDN().toString());
filterChain.doFilter(req, res);
}

随着我深入挖掘,我了解到像这样的异常很可能是由不同的类加载器引起的,尽管它们属于相同的类类型。我该如何解决这个问题?

谢谢

我使用以下 Spring 3 配置来逐个加载 Jetty 7

 <bean class="org.eclipse.jetty.server.Server"
init-method="start" destroy-method="stop">

<property name="connectors">
<list>
<bean id="SSLConnector" class="org.eclipse.jetty.server.ssl.SslSocketConnector">
<property name="port" value="8553"/>
<property name="maxIdleTime" value="3600000"/>
<property name="soLingerTime" value="-1"/>
<property name="needClientAuth" value="true"/>
<property name="sslContext">
<ref bean="sslContext"/>
</property>
</bean>
</list>
</property>

<property name="handler">
<bean name="contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
<property name="handlers">
<list>
<bean class="org.eclipse.jetty.servlet.ServletContextHandler">
<property name="contextPath">
<value>/caas</value>
</property>

<property name="resourceBase" value="src/main/secure_webapp"/>

<property name="sessionHandler">
<bean class="org.eclipse.jetty.server.session.SessionHandler"/>
</property>

<property name="servletHandler">

<bean class="org.eclipse.jetty.servlet.ServletHandler">
<property name="filters">
<list>
<bean class="org.eclipse.jetty.servlet.FilterHolder">
<property name="name" value="myfilter"/>
<property name="filter">
<bean class="com.acme.MyFilter"/>
</property>
</bean>
</list>
</property>

<property name="filterMappings">
<list>
<bean class="org.eclipse.jetty.servlet.FilterMapping">
<property name="pathSpec">
<value>/*</value>
</property>
<property name="filterName"
value="myfilter"/>
</bean>
</list>
</property>

<property name="servlets">
<list>
<bean class="org.eclipse.jetty.servlet.ServletHolder">
<property name="name" value="default"/>
<property name="servlet">
<bean class="org.eclipse.jetty.servlet.DefaultServlet"/>
</property>
</bean>
</list>
</property>

<property name="servletMappings">
<list>
<bean class="org.eclipse.jetty.servlet.ServletMapping">
<property name="pathSpecs">
<list>
<value>/</value>
</list>
</property>
<property name="servletName" value="default"/>
</bean>
</list>
</property>
</bean>
</property>
</bean>
</list>
</property>
</bean>
</property>
</bean>

最佳答案

在这种情况下,我不认为这是一个重复的类问题,因为 X509Certificate 包含在核心 JRE 库中。据我所知,没有其他库提供这个抽象类。

我认为问题在于 getAttribute() 返回一个 X509Certificate 对象数组,而您将其转换为单个对象。 ClassCastException消息的开头[L表示返回的对象是一个数组。

尝试转换为证书数组:

X509Certificate[] cert = (X509Certificate[])
req.getAttribute("javax.servlet.request.X509Certificate");

此外,我认为您应该从 getAttribute() 检索对象并使用 instanceof 检查它是否包含所需的类型,并可能以不同的方式处理它们。

关于classloader - Jetty-7.1.6.v20100715中获取X509Certificate时抛出ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4358506/

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