首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在其他域(CORS)上不传递凭据信息的SockJS

问在其他域(CORS)上不传递凭据信息的SockJS
EN

Stack Overflow用户
提问于 2014-10-22 05:40:18
回答 1查看 4K关注 0票数 1

我们有一个使用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有关吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-03 12:29:27

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

为了使用基本身份验证,您需要自己创建Authorization头,但SockJS客户端目前似乎不允许这样做。有一个问题要求这样的支持,我增加了一个新的评论解释说,我们需要这个基本身份验证支持。

由于授权头不是简单标头,因此将在实际请求之前发送CORS飞行前请求。但是Spring目前默认为不发送选项请求。,因此即使在客户端设置了授权头,您也需要启用Spring中的选项请求分派。

用web.xml

代码语言:javascript
复制
<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的类中。

代码语言:javascript
复制
@Override
protected void customizeRegistration(Dynamic registration) {
    registration.setInitParameter("dispatchOptionsRequest", "true");
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26500954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档