在 WebsocketAdapter [Jetty] 中获取 ServletMapping

Get ServletMapping in WebsocketAdapter [Jetty]

我的 WebsocketAdapter 中需要没有前缀的 Websocket 连接路径。

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

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

现在我用路径

打开一个 Websocket

localhost:8080/test/this-is-the-path-i-need

以后我不想在更改 url-模式后更改我的 Java-服务器代码。

我在由 WebsocketServlet 中的配置函数调用的 WebSocketCreator 中创建我的 WebsocketAdapter。

根据我的研究,我想我可以用 ServletMapping.getPathSpec() 得到它。问题是我不知道如何获得 ServletMapping。

有什么解决办法吗? (不局限于ServletMapping可能的解决方案)

Note: your url-pattern of /test/ would never match for a URI of localhost:8080/test/this-is-the-path-i-need, as that URI is not a match.
If you wanted to to have that URI match, then you would use the url-pattern of /test/* and then the request.pathInfo would have what you need/want.

您的 WEB-INF/web.xml 中用于访问您的 servlet/filter/websocket 的映射无法使用标准 Servlet API 从 Web 应用程序中访问。

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

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

Note: ServletMapping is an internal class to Jetty. It's not a public/formal API, so its use is discouraged for your declared use case of "In the future i dont want to change my 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);
    }
}