我们有一个使用spring 4的websocket服务器端实现,它已经被配置为为auth/authz使用spring安全性。在客户端,我们使用sockJS,当客户端与服务器位于同一个域中时,它可以很好地工作。
调用websocket是这样做的,…
socket =新SockJS("http://guest:guest@mydomain.org/MyWebSocketApp/tracker")
这最终会调用http://guest:guest@myinterestingdomain.org/MyWebSocketApp/tracker/info来决定要使用的传输。这一切都很好。
但是,当使用来自不同域的客户端时,我发现凭据会被删除。因此,当这个客户端位于不同的域中时,我看到正在进行的调用是:http://myinterestingdomain.com/MyWebSocketApp/tracker/info。我没有看到证书正在通过。因此,我得到了一个401错误(未经授权)用户。我们在服务器端有CORS配置,并且有:
访问-控制-允许-凭据“真”
有人能帮帮我吗?我没有选择了,我不明白为什么凭据被剥夺了?这可能与CORS有关吗?
发布于 2014-11-03 12:29:27
即使XmlHttpRequest.withCredentials=true (由SockJS客户端完成)和Access-Control-Allow-Credentials=true,您也不能在URL中为跨域请求传递用户名和密码。
为了使用基本身份验证,您需要自己创建Authorization头,但SockJS客户端目前似乎不允许这样做。有一个问题要求这样的支持,我增加了一个新的评论解释说,我们需要这个基本身份验证支持。
由于授权头不是简单标头,因此将在实际请求之前发送CORS飞行前请求。但是Spring目前默认为不发送选项请求。,因此即使在客户端设置了授权头,您也需要启用Spring中的选项请求分派。
用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>
或者,如果您使用的是没有web.xml的Servlet 3,那么将其添加到扩展AbstractAnnotationConfigDispatcherServletInitializer的类中。
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setInitParameter("dispatchOptionsRequest", "true");
}https://stackoverflow.com/questions/26500954
复制相似问题