2010-12-05 76 views
2

Le filtre que j'ai écrit jeté ClassCastExceptionClassCastException Jeté lors de l'obtention X509Certificate à la jetée-7.1.6.v20100715

[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, à savoir

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 que cela était comme exception très probablement causés par des chargeurs de classe différents bien qu'ils soient du même type de classe. Comment résoudre ça?

Merci

J'ai utilisé le printemps suivant 3 configurarion pour charger la jetée 7 au coup par coup

<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> 

Répondre

7

Je ne pense pas que ce soit un problème de classe en double dans ce cas, parce que X509Certificate est contenue dans le noyau JRE bibliothèques. Il n'y a, afaik, aucune autre bibliothèque qui fournisse cette classe abstraite.

Je pense que le problème est que le getAttribute() renvoie un tableau d'objets X509Certificate, alors que vous le convertissez en un seul objet. Le début [L du message ClassCastException indique que l'objet renvoyé 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 utiliser instanceof vérifie pour voir si elle contient les types et peut-être gérer les différemment.

+0

+1 Bien repéré – skaffman

+0

Tout droit. Que je suis bête. Merci. – thlim