ClassCastException Jeté lors de l'obtention X509Certificate dans Jetty-7.1.6.v20100715
-
08-10-2019 - |
Question
Le filtre j'ai écrit ClassCastException jeté
[Ljava.security.cert.X509Certificate; ne peut pas être jeté à java.security.cert.X509Certificate
quand j'ai essayé de jeter un objet extrait de l'attribut ServletRequest, i.e..
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);
}
Comme je l'ai plongeai je compris cette exception comme cela a été très probablement causée par différents classloaders bien qu'ils soient de même classe. Comment résoudre ça?
Merci
I utilisé comme suit Spring 3 configurarion pour charger la jetée 7 fragmentaire
<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>
La solution
Je ne pense pas que ce soit un problème de classe en double dans ce cas, parce que X509Certificate est contenue dans les bibliothèques de base JRE. Il est, autant que je sache, aucune autre bibliothèque qui fournit cette classe abstraite.
Je pense que le problème est le retour de getAttribute()
tableau d'objets X509Certificate , alors que vous l'avez lancé à un seul objet. Le [L
début du message ClassCastException indique que l'objet retourné est un tableau.
Essayez coulée à un tableau de certificats:
X509Certificate[] cert = (X509Certificate[])
req.getAttribute("javax.servlet.request.X509Certificate");
En outre, je pense que vous devez récupérer l'objet de getAttribute () et de l'utilisation instanceof vérifie pour voir si elle contient les types et peut-être les traiter différemment.