我写的过滤器抛出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 检查它是否包含所需的类型,并可能以不同的方式处理它们。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!