ClassCastexception брошен при получении X509Certificate в Jetty-7.1.6.V20100715
-
08-10-2019 - |
Вопрос
Фильтр, который я писал бросил классу
Ljava.security.cert.x509Certificate; не может быть отброшен в Java.security.cert.x509Certificate
Когда я попытался отбросить объект, извлеченный из атрибута сервелевастата, то есть
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 конфигурации для загрузки приема 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. Есть, AFAIK, без другой библиотеки, которая предоставляет этот абстрактный класс.
Я думаю, что проблема в getAttribute()
Возвращает АН Массив объектов X509Certificate, тогда как вы бросили его до одного объекта. Начало [L
Сообщения ClassCastexception указывает, что возвращаемый объект является массивом.
Попробуйте кастинг на массив сертификатов:
X509Certificate[] cert = (X509Certificate[])
req.getAttribute("javax.servlet.request.X509Certificate");
Кроме того, я думаю, что вы должны получить объект из GetAttribute () и использовать случай Проверяет, содержит ли он нужные типы и, возможно, обрабатывает их по-разному.