Java 在WebsocketAdapter[Jetty]中获取ServletMapping

Java 在WebsocketAdapter[Jetty]中获取ServletMapping,java,websocket,embedded-jetty,Java,Websocket,Embedded 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 将来,我不想在更改

我需要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中的configure函数调用的WebSocketCreator中创建WebsocketAdapter

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

有什么办法解决这个问题吗?不限于ServletMapping的可能解决方案

注意:您的/test/url模式永远不会与localhost:8080/test/this-is-the-path-i-need的URI匹配,因为该URI不匹配。 如果您希望该URI匹配,那么您将使用/test/*的url模式,然后request.pathInfo将具有您需要/想要的内容

用于访问servlet/filter/websocket的WEB-INF/WEB.xml映射无法从使用标准servlet API的webapp中访问

使用ServletAPI,您可以捕获已使用的完整路径或URI,然后从中去掉Servlet上下文路径前缀以获取所使用的路径

为此,您将使用来自的标准Servlet HttpServletRequest,收集路径,删除上下文路径前缀,可选地收集路径信息,然后将生成的路径传递到您刚刚创建的WebsocketAdapter中

注意:ServletMapping是Jetty的内部类。 它不是一个公共/正式的API,因此不鼓励在您声明的用例中使用它,因为将来我不想更改我的Java服务器代码

如果您仍然希望使用内部API,我建议您完全跳过ServletMapping,只使用此特定请求的已用PathSpec,您可以通过ServletUpgradeRequest属性访问它

公共静态类MyPathSpecCreator实现WebSocketCreator { 私有静态最终字符串PATHSPEC_KEY=PATHSPEC.class.getName; @凌驾 公共对象createWebSocketServletUpgradeRequest upgradeRequest, ServletUpgradeResponse升级响应升级响应 { String pathSpecPattern=//;//默认值选择您自己的 PathSpec PathSpec=PathSpec upgradeRequest.getServletAttributePATHSPEC\u键; ifpathSpec!=null pathSpecPattern=pathSpec.getDeclaration; 返回新的MyWebSocketAdapterpathSpecPattern模式; } }
很好,谢谢Joakim Erdfelt提供的快速且良好的解决方案!