2010-12-05 32 views
2

獲取x509證書我寫扔ClassCastException異常拋出ClassCastException當碼頭,7.1.6.v20100715

過濾器時拋出

[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); 
     } 

正如我更深入地挖掘我瞭解,像例外,這是最有可能由不同的類加載器引起,儘管它們具有相同的類類型。我該如何解決這個問題?

感謝

我用下面的彈簧3 configurarion裝載碼頭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> 

回答

7

我不認爲這是在這種情況下,重複類問題,因爲X509證書包含在覈心JRE庫。有一個afaik,沒有其他的圖書館提供這個抽象類。

我認爲問題是getAttribute()返回一個陣列的X509Certificate對象,而你把它放在一個單一的對象。 ClassCastException消息的開頭[L指示返回的對象是一個數組。

嘗試鑄造證書的數組:

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

而且,我認爲你應該檢索的getAttribute(對象),並使用的instanceof檢查,看它是否包含所需的類型,也許處理他們不同。

+0

+1斑點很好 – skaffman 2010-12-05 11:57:14

相關問題