我需要WebsocketAdapter中没有前缀的Websocket-Connection的路径。

F.E. web.xml中给出的前缀为:

<servlet-mapping>
    <url-pattern>
       /test/
    </url-pattern>
</servlet-mapping>


现在我用路径打开一个Websocket


  本地主机:8080 / test /这是我需要的路径


将来,我不想在更改url模式后更改我的Java服务器代码。

我在由WebsocketServlet中的configure-function调用的WebSocketCreator中创建WebsocketAdapter。

根据我的研究,我认为我可以通过ServletMapping.getPathSpec()获得它。问题在于我不知道如何获取ServletMapping。

任何想法如何解决这个问题? (不限于ServletMapping可能的解决方案)

最佳答案

注意:/test/的url模式将与localhost:8080/test/this-is-the-path-i-need的URI永远不匹配,因为该URI不匹配。
  如果要使该URI匹配,则可以使用/test/*的url-pattern,然后request.pathInfo将具有所需的内容。


使用标准Servlet API不能从webapp内访问用于访问servlet / filter / websocket的WEB-INF/web.xml映射。

使用Servlet API,您可以捕获使用过的完整路径或URI,然后从中删除Servlet上下文路径前缀,以获得使用的路径。

为此,您将使用HttpServletRequest中的标准Servlet ServletUpgradeRequest.getHttpServletRequest(),收集路径,删除上下文路径前缀,(可选)收集pathInfo,然后将结果路径传递到刚创建的WebsocketAdapter中。


  注意:ServletMapping是Jetty的内部类。
  它不是公共/正式API,因此不建议您在声明的用例“将来我不想更改Java-Server-Code ...”的情况下使用它。


如果您仍想使用内部API,建议您完全跳过ServletMapping,仅针对此特定请求使用常用的PathSpec,则可以通过ServletUpgradeRequest属性进行访问。

public static class MyPathSpecCreator implements WebSocketCreator
{
    private static final String PATHSPEC_KEY = PathSpec.class.getName();

    @Override
    public Object createWebSocket(ServletUpgradeRequest upgradeRequest,
                                  ServletUpgradeResponse upgradeResponse)
    {
        String pathSpecPattern = "/"; // default value (pick your own)
        PathSpec pathSpec = (PathSpec) upgradeRequest.getServletAttribute(PATHSPEC_KEY);
        if(pathSpec != null)
            pathSpecPattern = pathSpec.getDeclaration();
        return new MyWebSocketAdapter(pathSpecPattern);
    }
}

关于java - 在WebsocketAdapter中获取ServletMapping [Jetty],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50684512/

10-10 18:04