2014-10-22 61 views
1

我们有一个使用spring 4的websocket服务器端实现。它已被配置为使用auth/authz的spring安全性。在客户端,我们使用sockJS,当客户端与服务器位于同一个域时,sockJS可以很好地工作。SockJS在不同域(CORS)上没有传递证书信息

电话的WebSocket是由这样...

插座=新SockJS( “http://guest:[email protected]/MyWebSocketApp/tracker”)

这最终使得以http://guest:[email protected]/MyWebSocketApp/tracker/info调用决定运输使用。这一切都很好。

但是,当使用来自不同域的客户端时,我发现证书被剥离出来。所以,当这个客户端在不同的域上时,我看到正在进行的呼叫是: http://myinterestingdomain.com/MyWebSocketApp/tracker/info。我没有看到通过的凭据。由于这个原因,我得到了401错误(未经授权)的用户。我们已经在服务器端的CORS设定,并且有:

访问控制允许的凭据“真”

是否有人可以帮助我,我没办法了,我不明白为什么?凭据越来越剥离出来?难道这是关系到CORS?

回答

3

即使XmlHttpRequest.withCredentials=true(由SockJS客户端完成)和Access-Control-Allow-Credentials=true,你不能在URL跨域请求传递用户名和密码。

为了使用基本认证,你需要创建自己的Authorization头,但似乎SockJS客户端目前不允许这样做。有一个问题要求这种支持,我已经添加a new comment解释我们需要基本身份验证支持。

由于授权标头不是simple header,因此在实际请求之前会发送一个CORS preflight request。但是Spring Framework目前默认为does not dispatch OPTIONS requests,所以即使在客户端设置了Authorization头,您也需要在Spring Framework中启用OPTIONS请求分派。

随着web.xml

<servlet> 
<servlet-name>dispatcherServlet</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<init-param> 
    <param-name>dispatchOptionsRequest</param-name> 
    <param-value>true</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 

或者,如果你使用的是Servlet的三无web.xml,将它添加到您的类,它扩展AbstractAnnotationConfigDispatcherServletInitializer:用于提供建议

@Override 
protected void customizeRegistration(Dynamic registration) { 
    registration.setInitParameter("dispatchOptionsRequest", "true"); 
} 
+0

非常感谢。它澄清了很多。所以,这听起来像是端到端的功能工作,我们将不得不等待SockJS社区的修复。我的理解是否正确?同时,我们决定使用Spring的“纯粹”websocket支持。这意味着,从WebSocketConfigurer impl中删除.withSockJS()方法。我们已经证实,使用基于java的纯websocket客户端时,它工作正常。浏览器客户端(使用纯websocket JS)是否有一种解决方法可以跨域传递凭据? – myspri 2014-11-04 17:40:59