在 Java EE 的 WebSocket 端点中使路径参数可选
Making path parameters optional in WebSocket endpoints in Java EE
给出如下 WebSocket 端点。
@ServerEndpoint(value = "/Push/CartPush/{token}")
public final class CartPush {
// ...
}
端点能够接受路径参数{token}
。但是,路径参数是可选的 ,它在 Java 脚本中的 运行 时间动态确定。 在 Java 脚本中跳过此参数,如下所示结果 404
.
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush");
WebSocket connection to
'wss://localhost:8443/ContextPath/Push/CartPush'
failed: Error during
WebSocket handshake: Unexpected response code: 404
它使令牌值强制如下。
var token = "token value";
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush" + "/" + token);
为了排除除 GET
和 POST
之外的所有不需要的 HTTP 方法,我使用以下限制或约束以及使用适当的 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 -->
如何使给定的路径参数可选?
正在使用的服务器是 WildFly 10.0.0 final / Java EE 7.
不幸的是,WS URI 模板是 documented to follow [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);
给出如下 WebSocket 端点。
@ServerEndpoint(value = "/Push/CartPush/{token}")
public final class CartPush {
// ...
}
端点能够接受路径参数{token}
。但是,路径参数是可选的 ,它在 Java 脚本中的 运行 时间动态确定。 在 Java 脚本中跳过此参数,如下所示结果 404
.
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush");
WebSocket connection to
'wss://localhost:8443/ContextPath/Push/CartPush'
failed: Error during WebSocket handshake: Unexpected response code: 404
它使令牌值强制如下。
var token = "token value";
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush" + "/" + token);
为了排除除 GET
和 POST
之外的所有不需要的 HTTP 方法,我使用以下限制或约束以及使用适当的 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 -->
如何使给定的路径参数可选?
正在使用的服务器是 WildFly 10.0.0 final / Java EE 7.
不幸的是,WS URI 模板是 documented to follow [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);