【问题标题】:Making path parameters optional in WebSocket endpoints in Java EE在 Java EE 的 WebSocket 端点中使路径参数可选
【发布时间】:2016-03-03 19:42:54
【问题描述】:

给定一个 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);

为了排除除GETPOST 之外的所有不需要的HTTP 方法,我使用以下限制或约束以及在web.xml 中使用适当的URL 模式和角色映射的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 final / Java EE 7。

【问题讨论】:

  • 我想知道安全约束与具体问题有什么关系。当你忽略它时,问题仍然存在。
  • 我将该部分添加为附加信息,因为 GlassFish (4.1) 可以使用像 /Push/CartPush 这样的 URI,即使 &lt;url-pattern&gt;/Push/*&lt;/url-pattern&gt; 已从 web.xml 中排除或删除。另一方面,当 &lt;url-pattern&gt;web.xml 中排除时,WildFly 会报告 403/Push/CartPush。我不知道原因。

标签: jakarta-ee websocket endpoint path-parameter


【解决方案1】:

不幸的是,WS URI 模板是 documented 遵循 [RFC 6570 Level 1] 2 模板。所以像 /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);

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多