Java 在WebsocketAdapter[Jetty]中获取ServletMapping
我需要WebsocketAdapter中不带前缀的Websocket连接的路径 F.E.web.xml中给出的前缀是: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 将来,我不想在更改
<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提供的快速且良好的解决方案!