【发布时间】: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);
为了排除除GET 和POST 之外的所有不需要的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,即使<url-pattern>/Push/*</url-pattern>已从web.xml中排除或删除。另一方面,当<url-pattern>从web.xml中排除时,WildFly 会报告403和/Push/CartPush。我不知道原因。
标签: jakarta-ee websocket endpoint path-parameter