2016-03-03 56 views
2

給定WebSocket端點如下。在Java EE的WebSocket端點中使路徑參數可選

@ServerEndpoint(value = "/Push/CartPush/{token}") 
public final class CartPush { 
    // ... 
} 

端點能夠接受路徑參數{token}。但是,路徑參數是可選的,它是在Java腳本的運行時動態確定的。在JavaScript中跳過此參數,如下面的結果404

var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush"); 

WebSocket連接到 'wss://localhost:8443/ContextPath/Push/CartPush'失敗:錯誤期間 WebSocket的握手:意外的響應代碼:404

它使得令牌值強制如下。

var token = "token value"; 
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush" + "/" + token); 

爲了排除除了GETPOST所有不需要的HTTP方法,我用下面的限制或約束,使用適當的URL模式和角色映射在web.xml Servlet安全限制一起。

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Disable unneeded HTTP methods by 403</web-resource-name> 

     <url-pattern>/Public/*</url-pattern> 
     <url-pattern>/Push/*</url-pattern> 
     <url-pattern>/javax.faces.resource/*</url-pattern> 

     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
</security-constraint> 

<deny-uncovered-http-methods/> <!-- Requires Servlet 3.1 --> 

如何使給定的路徑參數可選?

所用的服務器是WildFly 10.0.0最後/的Java EE 7

+0

我不知道什麼安全性約束得到了與具體問題做。問題仍然會保持良好,當你離開它。 – BalusC

+0

我添加了該部分作爲附加信息,因爲即使從'web.xml'中排除或刪除'/Push/*',GlassFish(4.1)可以像'/ Push/CartPush'一樣使用URI。另一方面,WildFly在從'web.xml'中排除''時,會用'/ Push/CartPush'報告'403'。我不知道原因。 – Tiny

回答

5

不幸的是,WS URI模板是documented遵循RFC 6570 Level 1模板。所以像/Push/CartPush{/token}這樣的3級模板將無法解決問題。

您最好的選擇是將其後綴/並讓令牌爲空字符串。

var token = ""; 
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush/" + token); 

這可能值得在WS spec guys增強請求。

鑑於該參數已在客戶端完全定義,替代方法是將其作爲請求參數提供。自然地,請求參數表示客戶定義的參數。

var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush?token=" + token); 

String token = session.getRequestParameterMap().get("token").get(0);