gpt4 book ai didi

java - 在WebsocketAdapter中获取ServletMapping [Jetty]

转载 作者:行者123 更新时间:2023-12-02 11:09:54 37 4
gpt4 key购买 nike

我需要 Websocket-Connection 的路径,而不需要 WebsocketAdapter 中的前缀。

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.

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

使用 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);
}
}

关于java - 在WebsocketAdapter中获取ServletMapping [Jetty],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50684512/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com