Som*_*iks 26 servlets java-ee httpsession websocket java-websocket
我需要ServletContext
从内部获取@ServerEndpoint
,以便找到Spring ApplicationContext
并查找Bean.
目前我最好的方法是在JNDI命名上下文中绑定该bean并在其中查找它Endpoint
.欢迎任何更好的解决方案.
我也在寻找一种合理的方法来将servlet HttpSession
与websocket 同步Session
.
Bal*_*usC 39
该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);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何使用它,请注意以下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();
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
作为设计提示,最好保持@ServerEndpoint
完全不受servlet API依赖的影响.您的倒是modifyHandshake()
实现更好立即准确提取是你从servlet会话或上下文需要的信息(通常是一个可变的Javabean),并把它们在用户属性映射来代替.如果你不这样做,那么你应该记住,websocket会话可以比HTTP会话更长寿.因此,当您仍然随身携带HttpSession
进入端点时,您可能会IllegalStateException
在尝试访问它时遇到它.
如果您碰巧有CDI(也许还有JSF),您可以从OmniFaces<o:socket>
的源代码中获得灵感(链接位于展示的最底层).
更新了BalusC的答案代码,onOpen方法需要用@OnOpen进行修饰.然后就不再需要扩展Endpoint类了:
@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();
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12560 次 |
最近记录: |