在 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);
}
}
我的 WebsocketAdapter 中需要没有前缀的 Websocket 连接路径。
F.E。 web.xml 中给出的前缀是:
<servlet-mapping>
<url-pattern>
/test/
</url-pattern>
</servlet-mapping>
现在我用路径
打开一个 Websocketlocalhost: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 oflocalhost: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 therequest.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);
}
}