gpt4 book ai didi

servlets - 在 JSR-356 @ServerEndpoint 的 @OnMessage 中访问 ServletContext 和 HttpSession

转载 作者:行者123 更新时间:2023-12-02 10:08:49 25 4
gpt4 key购买 nike

我需要从 @ServerEndpoint 内部获取 ServletContext 以便找到 Spring ApplicationContext 并查找 Bean。

目前,我最好的方法是在 JNDI 命名上下文中绑定(bind)该 bean,并在 Endpoint 中查找它。欢迎任何更好的解决方案。

我也在寻找一种合理的方法来同步 servlet 的 HttpSession 与 websocket 的 Session

最佳答案

servlet HttpSession采用 JSR-356 格式,可通过 HandshakeRequest#getHttpSession() 获取当在 @OnOpen 之前发出握手请求时,该信息又可用。的 @ServerEndpoint ServletContext反过来只能通过 HttpSession#getServletContext() 获得。这就是一石二鸟。

为了捕获握手请求,请实现 ServerEndpointConfig.Configurator 并覆盖 modifyHandshake() 方法。 HandshakeRequest在这里可用作方法参数。您可以输入 HttpSession进入 EndpointConfig#getUserProperties() EndpointConfig依次可用作方法参数 @OnOpen .

这是 ServerEndpointConfig.Configurator 的启动示例实现:

public class ServletAwareConfig extends ServerEndpointConfig.Configurator {

@Override
public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
HttpSession httpSession = (HttpSession) request.getHttpSession();
config.getUserProperties().put("httpSession", httpSession);
}

}

以下是如何使用它,请注意 configurator @ServerEndpoint 的属性:

@ServerEndpoint(value="/your_socket", configurator=ServletAwareConfig.class)
public class YourSocket {

private EndpointConfig config;

@OnOpen
public void onOpen(Session websocketSession, EndpointConfig config) {
this.config = config;
}

@OnMessage
public void onMessage(String message) {
HttpSession httpSession = (HttpSession) config.getUserProperties().get("httpSession");
ServletContext servletContext = httpSession.getServletContext();
// ...
}

}

作为设计提示,最好保留您的 @ServerEndpoint完全摆脱 servlet API 依赖。你会在 modifyHandshake()实现最好立即从 servlet session 或上下文中准确提取您需要的信息(通常是可变的 Javabean),并将它们放入用户属性映射中。如果您不这样做,那么您应该记住,websocket session 的生存时间可以比 HTTP session 更长。所以当你仍然随身携带 HttpSession进入端点,那么你可能会遇到 IllegalStateException当您尝试在其过期时访问它时。

如果您手头恰好有 CDI(也许还有 JSF),您可能会从 OmniFaces <o:socket> 的源代码中获得灵感。 (链接位于展示的最底部)。

另请参阅:

关于servlets - 在 JSR-356 @ServerEndpoint 的 @OnMessage 中访问 ServletContext 和 HttpSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888425/

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