【问题标题】:Problems with Spring WS Streaming Attachments with Security Interceptor带有安全拦截器的 Spring WS 流附件的问题
【发布时间】:2011-06-07 06:02:42
【问题描述】:

我在让 Spring WS 接收附加文件并使用流式传输的请求时遇到问题。问题是每当我尝试使用安全拦截器时都会出现以下异常:

2011-01-11 15:10:05,132 调试 [org.springframework.ws.soap.server.SoapMessageDispatcher] - java.lang.IllegalArgumentException:将 SOAP 信封转换为文档时出错 在 org.springframework.ws.soap.axiom.support.AxiomUtils.toDocument(AxiomUtils.java:135) 在 org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor.toDocument(Wss4jSecurityInterceptor.java:621) 在 org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor.validateMessage(Wss4jSecurityInterceptor.java:492) 在 org.springframework.ws.soap.security.AbstractWsSecurityInterceptor.handleRequest(AbstractWsSecurityInterceptor.java:104) 在 org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:213) 在 org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:168) 在 org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88) 在 org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57) 在 org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:230) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:530) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:426) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:457) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:931) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:361) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:867) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:245) 在 org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) 在 org.eclipse.jetty.server.Server.handle(Server.java:337) 在 org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:581) 在 org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1020) 在 org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:775) 在 org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:228) 在 org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:417) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:474) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:437) 在 java.lang.Thread.run(Thread.java:595) 引起:org.apache.axiom.om.OMException: java.util.NoSuchElementException 在 org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:249) 在 org.apache.axiom.om.impl.llom.OMNodeImpl.build(OMNodeImpl.java:327) 在 org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:706) 在 org.springframework.ws.soap.axiom.support.AxiomUtils.toDocument(AxiomUtils.java:125) ... 34 更多 引起:java.util.NoSuchElementException 在 com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1083) 在 org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:506) 在 org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:161) ... 37 更多

我正在使用 Axiom 消息工厂:

<bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
    <property name="payloadCaching" value="false"/>
    <property name="attachmentCaching" value="true"/>
    <property name="attachmentCacheThreshold" value="1024" />
</bean>

我的端点映射使用 wss4jSecurityInterceptor:

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
    <property name="mappings">
        <props>
            <prop key="{http://www.aquilauk.co.uk/hribulkupload}BulkHRRequest">hriBulkUploadEndpoint</prop>
        </props>
    </property>
     <property name="interceptors">
        <list>
            <!-- <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/> -->
            <ref bean="wss4jSecurityInterceptor"/>
        </list>            
    </property>
</bean>

并且我的安全拦截器已设置为确保它不使用 Payload:

<bean id="wss4jSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
    <property name="validationActions" value="UsernameToken" />
    <property name="validationCallbackHandler" ref="springWSS4JHandler"/>
    <property name="secureResponse" value="false"/>
    <property name="secureRequest" value="false" />
</bean> 


<bean id="acegiWSS4JHandler" 
    class="org.springframework.ws.soap.security.wss4j.callback.SpringPlainTextPasswordValidationCallbackHandler">
    <property name="authenticationManager" ref="authenticationManager"/>
</bean>

请注意, 克雷格

【问题讨论】:

    标签: streaming spring-ws mtom axiom


    【解决方案1】:

    我相信您定义的安全拦截器仍然会消耗有效负载。它只是不对它执行任何安全验证。应该调用 AxiomSoapMessageFactory.createWebServiceMesssage() 方法以创建提供给安全拦截器的 MessageContext。然后安全拦截器根据secureRequest标志忽略它。

    【讨论】:

    • 您会对安全拦截器的配置进行哪些更改以确保调用 createWebServiceMessage() 方法?
    • 我的意思是,这个方法调用了,不管你在拦截器上设置了什么标志,它都会消耗有效负载。假设这是正确的,我认为您可能需要将 payloadCaching 设置为 true,并依靠附件缓存来减少内存占用。
    • 我已经尝试过了,payloadCaching 确实允许安全拦截器运行,但是当它打开时,我在 Endpoint 中收到 OutOfMemoryError,即使我的附件缓存也是如此。
    【解决方案2】:

    我通过反复试验找到了解决这个问题的方法:

    问题在于 wss4jSecurityInterceptor 的设置,行:

    <property name="secureResponse" value="false"/>
    <property name="secureRequest" value="false" />
    

    应该是:

    <property name="validateRequest" value="false" />
    <property name="validateResponse" value="false" />
    

    【讨论】:

    • 嗨 Craig,如果我添加 拦截器根本不会验证.即使没有安全标头请求也被处理。是一样的还是我错过了什么
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2014-07-18
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多