我正在做一个JavaEE Web套接字项目,用于与Android手机建立Web套接字连接。在我的项目中,我需要记住服务器端连接客户端的 Web 套接字会话。
如果移动客户端手动断开连接,那么他的会话将从我的会话映射中删除,因此没有问题,但如果 Web 套接字连接被取消但结果为 wifi 而不是服务器不会收到套接字关闭请求,因此我的会话映射中会有过时的 Web 套接字会话。我的问题是如何知道我的会话映射中的会话在这些情况下是否处于活动状态。
我尝试的是,我尝试使用会话映射中的会话对象ping客户端,但它总是向我发送pong消息,无论客户端是否处于活动状态。 帮助我提出好的建议。
您可以侦听会话销毁。
假设您有一个 CDI @SessionScoped
管理的 Bean,请使用 @PreDestroy
。
@SessionScoped
public class SocketManager implements Serializable {
// ...
@PreDestroy
public void sessionDestroyed() {
// Close web sockets here.
}
}
或者,如果您手头没有 CDI,请使用 HttpSessionListener#sessionDestroyed()
。
@WebListener
public class SocketManager implements HttpSessionListener {
// ...
@Override
public void sessionDestroyed(HttpSessionEvent event) {
// Close web sockets here.
}
}
也就是说,在 HTTP 会话中存储不可序列化的 Web 套接字会话是一个坏主意。而是将它们存储在应用程序作用域中,由一些唯一标识符键控,而这些标识符又与 HTTP 会话相关联。