Jetty-7.1.6.V20100715でX509Certificateを取得するときにClassCastExceptionが投げられます

StackOverflow https://stackoverflow.com/questions/4358506

質問

私が書いたフィルターは、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 Configurarionを使用して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() andを返します X509Certificateオブジェクトの配列, 、一方、単一のオブジェクトにキャストします。始まり [L ClassCastExceptionメッセージのメッセージは、返されたオブジェクトが配列であることを示しています。

一連の証明書にキャストしてみてください。

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

また、getattribute()からオブジェクトを取得して使用する必要があると思います instanceof それが望ましいタイプを含んでいるかどうかを確認し、それらを異なる方法で処理するかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top