我需要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/