ClassCastException generata quando Ottenere X509Certificate in Jetty-7.1.6.v20100715
-
08-10-2019 - |
Domanda
Il filtro che ho scritto buttato ClassCastException
[Ljava.security.cert.X509Certificate; non può essere gettato a java.security.cert.X509Certificate
quando ho cercato di lanciare un oggetto estratto dall'attributo ServletRequest, cioè.
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);
}
Come ho scavato più a fondo ho capito che un'eccezione come questo è stato probabilmente causato da diversi classloader anche se sono dello stesso tipo di classe. Come posso risolvere questo?
Grazie
ho usato il seguente Spring 3 configurarion caricare molo 7 frammentario
<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>
Soluzione
Non credo che sia un problema di classe duplicata in questo caso, perché X509Certificate è contenuta nelle librerie JRE core. Non v'è, per quanto ne so, nessun altro libreria che fornisce questa classe astratta.
Credo che il problema è il getAttribute()
restituisce un array di oggetti X509Certificate , mentre la lanci verso il basso per un singolo oggetto. La [L
inizio del messaggio ClassCastException indica che l'oggetto restituito è un array.
Prova a trasmettere ad una serie di certificati:
X509Certificate[] cert = (X509Certificate[])
req.getAttribute("javax.servlet.request.X509Certificate");
Inoltre, penso che si dovrebbe recuperare l'oggetto da getAttribute () e l'uso instanceof controlli per vedere se contiene i tipi desiderati e magari gestirli in modo diverso.