我在玩 Jetty ( 9.2.3v20140905ServerEndpointConfig
) 时连接了一个 Web 套接字端点,当我遇到 Jetty 的代码以查看它是如何使用的时,我尝试使用我自己的端点。我注意到它在JsrCreator
创建 Web 套接字对象时使用:
Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp){
...
// modify handshake
configurator.modifyHandshake(config,hsreq,hsresp);
...
}
我阅读了( javax.websocket-api 1.0 )的javadoc modifyHandshake
,ServerEndpointConfig
其中指出:
由容器在形成由格式良好的握手请求产生的握手响应后调用。容器已经检查了这个配置有一个匹配的 URI ,使用checkOrigin 方法确定了源的有效性,并根据这个配置填写了协商的子协议和扩展。自定义配置可能会覆盖此方法,以检查请求参数并修改服务器已制定的握手响应。以及 URI 检查。 如果开发人员不重写此方法,则实现不会对请求和响应进行进一步修改。
以下是 Jetty 的作用:
Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp){
...
// modify handshake
configurator.modifyHandshake(config,hsreq,hsresp);
// check origin
if (!configurator.checkOrigin(req.getOrigin())){...}
...
resp.setAcceptedSubProtocol(subprotocol);
...
resp.setExtensions(configs);
}
如您所见,在调用配置器之后检查原点。在调用配置器之后修改响应。调用 WebSocketCreatoracceptWebSocket
的方法:WebSocketServerFactory
Object websocketPojo = creator.createWebSocket(sockreq, sockresp);
之后调用:
private boolean upgrade(HttpConnection http, ServletUpgradeRequest request, ServletUpgradeResponse response, EventDriver driver)
它还通过以下方式修改响应HandshakeRFC6455
:
// build response
response.setHeader("Upgrade","WebSocket");
response.addHeader("Connection","Upgrade");
response.addHeader("Sec-WebSocket-Accept",AcceptHash.hashKey(key));
所以我没有办法只用我的配置器来修改响应,因为 Jetty 无论如何都会改变它。
在我看来,Jetty 不符合 JSR 356,即 WebSocket 的 Java API,是吗?