在Java EE中的WebSocket端点中使路径参数可选

Tin*_*iny 3 endpoint java-ee websocket path-parameter

给定WebSocket端点如下.

@ServerEndpoint(value = "/Push/CartPush/{token}")
public final class CartPush {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

端点能够接受路径参数{token}.但是,path参数是可选的,它是在Java Script中在运行时动态确定的.在JavaScript中跳过此参数,如下所示404.

var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush");
Run Code Online (Sandbox Code Playgroud)

WebSocket连接 'wss://localhost:8443/ContextPath/Push/CartPush'失败:WebSocket握手期间出错:意外响应代码:404

它使得令牌值必须如下.

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

为了排除除GET和之外的所有不需要的HTTP方法POST,我使用以下限制或约束以及使用适当的URL模式和角色映射的Servlet安全性约束web.xml.

<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 -->
Run Code Online (Sandbox Code Playgroud)

如何使给定的路径参数可选?

正在使用的服务器是WildFly 10.0.0 final/Java EE 7.

Bal*_*usC 7

遗憾的是,WS URI模板被记录为遵循RFC 6570 Level 1模板.所以3级模板就好/Push/CartPush{/token}了.

你最好的选择总是用它后缀/,让令牌成为一个空字符串.

var token = "";
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush/" + token);
Run Code Online (Sandbox Code Playgroud)

WS规范的人可能值得一个增强请求.

鉴于参数在客户端中完全定义,另一种方法是将其作为请求参数提供.当然,请求参数代表客户定义的参数.

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

String token = session.getRequestParameterMap().get("token").get(0);
Run Code Online (Sandbox Code Playgroud)