2012-12-17 20 views
2

我有SSL(GlassFish的3.1.2和JAX-WS),固定一个EJB端点Web服务 我使用了一个拦截器登录的用户工作之外的活动:拦截休息Web服务的SSL联接

@Statless 
public class WebServiceInterceptor { 

    @Resource 
    WebServiceContext wsContext; 

    @AroundInvoke 
    protected Object audit(InvocationContext ctx) throws Exception { 



     MessageContext mc = wsContext.getMessageContext(); 


     try { 
      Principal principal = wsContext.getUserPrincipal(); 
      user = principal.getName(); 
      System.out.println("user:" + user); 
     } catch (Exception e) { 
      System.out.println("log faild!"); 
     } 
} 

当拦截器triggred我得到这个异常:

ATTENTION: invocation error on ejb endpoint Oculus_ws_v1 at /mywebservice/mywebservice : com.ctc.wstx.exc.WstxIOException: null 
javax.xml.ws.WebServiceException: com.ctc.wstx.exc.WstxIOException: null 
    at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:130) 
    at com.sun.xml.ws.security.encoding.LazyStreamCodec.encode(LazyStreamCodec.java:88) 
    at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:285) 
    at com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:421) 
    at com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:99) 
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:650) 
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263) 
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:163) 
    at org.glassfish.webservices.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:120) 
    at org.glassfish.webservices.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:91) 
    at org.glassfish.webservices.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:200) 
    at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:131) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.doFilter(ServletAdapter.java:1059) 
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.invokeFilterChain(ServletAdapter.java:999) 
    at com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:434) 
    at com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:384) 
    at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) 
    at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: com.ctc.wstx.exc.WstxIOException: null 
    at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:263) 
    at com.sun.xml.ws.util.xml.XMLStreamWriterFilter.flush(XMLStreamWriterFilter.java:71) 
    at com.sun.xml.ws.streaming.XMLStreamWriterUtil.getOutputStream(XMLStreamWriterUtil.java:103) 
    at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:382) 
    at com.sun.xml.ws.security.opt.impl.message.SOAPBody.writePayload(SOAPBody.java:132) 
    at com.sun.xml.ws.security.opt.impl.message.SOAPBody.writeTo(SOAPBody.java:166) 
    at com.sun.xml.ws.security.opt.impl.message.SecuredMessage.writeTo(SecuredMessage.java:364) 
    at com.sun.xml.ws.security.opt.impl.message.MessageWrapper.writeTo(MessageWrapper.java:355) 
    at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:127) 
    ... 34 more 
Caused by: ClientAbortException: java.io.IOException: SSLOutputWriter: CLOSED 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputBuffer.doFlush(GrizzlyOutputBuffer.java:439) 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputBuffer.flush(GrizzlyOutputBuffer.java:405) 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputStream.flush(GrizzlyOutputStream.java:140) 
    at com.sun.grizzly.http.servlet.ServletOutputStreamImpl.flush(ServletOutputStreamImpl.java:100) 
    at com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:103) 
    at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:225) 
    at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:261) 
    ... 42 more 
Caused by: java.io.IOException: SSLOutputWriter: CLOSED 
    at com.sun.grizzly.util.SSLOutputWriter.flushChannel(SSLOutputWriter.java:98) 
    at com.sun.grizzly.ssl.SSLOutputBuffer.flushChannel(SSLOutputBuffer.java:138) 
    at com.sun.grizzly.http.SocketChannelOutputBuffer.flushBuffer(SocketChannelOutputBuffer.java:498) 
    at com.sun.grizzly.http.SocketChannelOutputBuffer.flush(SocketChannelOutputBuffer.java:476) 
    at com.sun.grizzly.http.ProcessorTask.action(ProcessorTask.java:1287) 
    at com.sun.grizzly.ssl.SSLProcessorTask.action(SSLProcessorTask.java:164) 
    at com.sun.grizzly.tcp.Response.action(Response.java:268) 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputBuffer.doFlush(GrizzlyOutputBuffer.java:434) 
    ... 48 more 

INFO: user:super_hd 
ATTENTION: invocation error on ejb endpoint Oculus_ws_v1 at /Oculus_ws_v1/Oculus_ws_v1 : com.ctc.wstx.exc.WstxIOException: null 
javax.xml.ws.WebServiceException: com.ctc.wstx.exc.WstxIOException: null 
    at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:130) 
    at com.sun.xml.ws.security.encoding.LazyStreamCodec.encode(LazyStreamCodec.java:88) 
    at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:285) 
    at com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:421) 
    at com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:99) 
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:650) 
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263) 
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:163) 
    at org.glassfish.webservices.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:120) 
    at org.glassfish.webservices.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:91) 
    at org.glassfish.webservices.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:200) 
    at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:131) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.doFilter(ServletAdapter.java:1059) 
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.invokeFilterChain(ServletAdapter.java:999) 
    at com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:434) 
    at com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:384) 
    at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) 
    at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: com.ctc.wstx.exc.WstxIOException: null 
    at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:263) 
    at com.sun.xml.ws.util.xml.XMLStreamWriterFilter.flush(XMLStreamWriterFilter.java:71) 
    at com.sun.xml.ws.streaming.XMLStreamWriterUtil.getOutputStream(XMLStreamWriterUtil.java:103) 
    at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:382) 
    at com.sun.xml.ws.security.opt.impl.message.SOAPBody.writePayload(SOAPBody.java:132) 
    at com.sun.xml.ws.security.opt.impl.message.SOAPBody.writeTo(SOAPBody.java:166) 
    at com.sun.xml.ws.security.opt.impl.message.SecuredMessage.writeTo(SecuredMessage.java:364) 
    at com.sun.xml.ws.security.opt.impl.message.MessageWrapper.writeTo(MessageWrapper.java:355) 
    at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:127) 
    ... 34 more 
Caused by: ClientAbortException: java.io.IOException: SSLOutputWriter: CLOSED 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputBuffer.doFlush(GrizzlyOutputBuffer.java:439) 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputBuffer.flush(GrizzlyOutputBuffer.java:405) 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputStream.flush(GrizzlyOutputStream.java:140) 
    at com.sun.grizzly.http.servlet.ServletOutputStreamImpl.flush(ServletOutputStreamImpl.java:100) 
    at com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:103) 
    at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:225) 
    at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:261) 
    ... 42 more 
Caused by: java.io.IOException: SSLOutputWriter: CLOSED 
    at com.sun.grizzly.util.SSLOutputWriter.flushChannel(SSLOutputWriter.java:98) 
    at com.sun.grizzly.ssl.SSLOutputBuffer.flushChannel(SSLOutputBuffer.java:138) 
    at com.sun.grizzly.http.SocketChannelOutputBuffer.flushBuffer(SocketChannelOutputBuffer.java:498) 
    at com.sun.grizzly.http.SocketChannelOutputBuffer.flush(SocketChannelOutputBuffer.java:476) 
    at com.sun.grizzly.http.ProcessorTask.action(ProcessorTask.java:1287) 
    at com.sun.grizzly.ssl.SSLProcessorTask.action(SSLProcessorTask.java:164) 
    at com.sun.grizzly.tcp.Response.action(Response.java:268) 
    at com.sun.grizzly.tcp.http11.GrizzlyOutputBuffer.doFlush(GrizzlyOutputBuffer.java:434) 
    ... 48 more 

如果我禁用SSL ecnryption或评论wsContext.getUserPrincipal();一切运行正常。 感谢

编辑1: 它apperas,这不涉及到thse使用拦截器,如果我把这个方法:

@Resource 
    WebServiceContext wsContext; 

    @WebMethod(operationName = "hello") 
    public String hello(@WebParam(name = "name") String txt) { 
     System.out.println("ws context:" + wsContext.getUserPrincipal()); 

     return "Hello " + txt + " !"; 
    } 

我得到几乎相同的异常

ATTENTION: processorTask.exceptionSSLcert 
javax.net.ssl.SSLException: SSLEngine is closing/closed 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.kickstartHandshake(SSLEngineImpl.java:656) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.beginHandshake(SSLEngineImpl.java:689) 
    at com.sun.grizzly.util.SSLUtils.doPeerCertificateChain(SSLUtils.java:563) 
    at com.sun.grizzly.filter.SSLReadFilter.doPeerCertificateChain(SSLReadFilter.java:340) 
    at com.sun.grizzly.ssl.SSLProcessorTask.action(SSLProcessorTask.java:153) 
    at com.sun.grizzly.tcp.Request.action(Request.java:430) 
    at com.sun.grizzly.tcp.http11.GrizzlyRequest.getAttribute(GrizzlyRequest.java:835) 
    at com.sun.grizzly.tcp.http11.GrizzlyRequest.getUserPrincipal(GrizzlyRequest.java:1845) 
    at com.sun.grizzly.http.servlet.HttpServletRequestImpl.getUserPrincipal(HttpServletRequestImpl.java:906) 
    at com.sun.xml.ws.transport.http.servlet.ServletConnectionImpl.getUserPrincipal(ServletConnectionImpl.java:219) 
    at com.sun.xml.ws.server.AbstractWebServiceContext.getUserPrincipal(AbstractWebServiceContext.java:84) 
    at org.glassfish.webservices.WebServiceContextImpl.getUserPrincipal(WebServiceContextImpl.java:112) 
    at Ws.PocWS.hello(PocWS.java:32) 

任何解决方法将是很好 。

回答

1

Apparenlty这是一个奇怪的,但没有错误的行为。

如果您在使用ssl/jax-ws加密时调用getPrincipal(),那么容器会自动切换到相互ssl认证。因此,这会打破整个事情,因为我没有在客户端配置密钥库。 可以找到解决方法here

+0

未找到链接。你能否更新它?现在有同样的问题:) – Aditya