4

给定一个 WebSocket 端点,如下所示。

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

端点能够接受路径参数{token}。然而,路径参数是可选的,它是在 Java Script 的运行时动态确定的。在 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);

为了排除除GETand之外的所有不需要的 HTTP 方法POST,我使用以下限制或约束以及 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 -->

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

使用的服务器是 WildFly 10.0.0 final / Java EE 7。

4

1 回答 1

10

不幸的是,WS URI 模板被记录为遵循 [RFC 6570 Level 1 ] 2模板。因此,像这样的 3 级模板是/Push/CartPush{/token}行不通的。

你最好的选择总是给它加上后缀,/让令牌是一个空字符串。

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

可能值得向WS 规范人员提出增强请求。

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

var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush?token=" + token);
String token = session.getRequestParameterMap().get("token").get(0);
于 2016-03-03T21:16:40.887 回答