2014-10-22 63 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