Jakarta ee 在JavaEE中使WebSocket端点中的路径参数可选

Jakarta ee 在JavaEE中使WebSocket端点中的路径参数可选,jakarta-ee,websocket,endpoint,path-parameter,Jakarta Ee,Websocket,Endpoint,Path Parameter,给定一个WebSocket端点,如下所示 @ServerEndpoint(value = "/Push/CartPush/{token}") public final class CartPush { // ... } 端点能够接受路径参数{token}。但是,path参数是可选的,在Java脚本的运行时动态确定。在JavaScript中跳过此参数,如下所示将导致404 var ws=新的WebSocket(“wss://localhost:8443/ContextPath/Push/

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

@ServerEndpoint(value = "/Push/CartPush/{token}")
public final class CartPush {
    // ...
}
端点能够接受路径参数
{token}
。但是,path参数是可选的,在Java脚本的运行时动态确定。在JavaScript中跳过此参数,如下所示将导致
404

var ws=新的WebSocket(“wss://localhost:8443/ContextPath/Push/CartPush");
WebSocket连接到
'wss://localhost:8443/ContextPath/Push/CartPush“
失败:执行过程中出错 WebSocket握手:意外响应代码:404

它使令牌值强制如下

@ServerEndpoint(value = "/Push/CartPush/{token}")
public final class CartPush {
    // ...
}
var-token=“token-value”;
var ws=新的WebSocket(“wss://localhost:8443/ContextPath/Push/CartPush“+”/“+令牌);
为了排除除
GET
POST
之外的所有不需要的HTTP方法,我在
web.xml
中使用了以下限制或约束以及使用适当URL模式和角色映射的Servlet安全约束


通过403禁用不需要的HTTP方法
/公开的/*
/推/*
/javax.faces.resource/*
得到
邮递
如何使给定的路径参数成为可选的


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

不幸的是,WS-URI模板要遵循模板。所以像
/Push/CartPush{/token}
这样的3级模板将无法工作

您的最佳选择始终是使用
/
作为其后缀,并将令牌设为空字符串

var token = "";
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush/" + token);
它可能值得一个增强请求

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

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


我想知道安全限制与具体问题有什么关系。如果你不考虑这个问题,这个问题仍然有效。我添加了这个部分作为补充信息,因为GlassFish(4.1)可以处理URI,比如
/Push/CartPush
,即使
/Push/*
被排除或从
web.xml
中删除。另一方面,当
web.xml
中被排除时,WildFly将使用
/Push/CartPush
报告
403
。我不知道原因。