2
我正在運行tomcat 8來終止websocket連接。我想讓所有活動的websocket會話對於一個端點來說。我知道如果你有一個會話對象,你可以調用getOpenSessions()來獲得所有的會話,但問題是我沒有權限訪問會話對象,我需要從代碼中獲取所有會話。如何以編程方式在tomcat中獲得活動websocket會話?
我正在運行tomcat 8來終止websocket連接。我想讓所有活動的websocket會話對於一個端點來說。我知道如果你有一個會話對象,你可以調用getOpenSessions()來獲得所有的會話,但問題是我沒有權限訪問會話對象,我需要從代碼中獲取所有會話。如何以編程方式在tomcat中獲得活動websocket會話?
哇,近一年後沒有答案!我偶然發現了這個問題,同時通過getOpenSessions()在Tomcat 8上尋找一些問題的線索。對於我的問題,我最終做了以下,這也將解決這個問題。一般來說,只需要有一個靜態地圖,您可以在打開和關閉時移除:
@ServerEndpoint(value="/msg/{owner}", encoders=MessageEncoder.class, decoders=MessageEncoder.class)
public class WebSocketListener {
private static final Logger logger = LoggerFactory.getLogger(WebSocketListener.class);
private static Map<String, Session> sessions = new HashMap<String, Session>();
public WebSocketListener() {
System.out.println("created");
}
@OnOpen
public void open(Session session, @PathParam("owner") String owner) {
System.out.println("open "+owner);
sessions.put(session.getId(), session);
session.getUserProperties().put("owner", owner);
System.out.println("open");
if (session.getUserPrincipal() != null) {
session.getUserProperties().put("owner", owner);
}
else {
try {
session.close(new CloseReason(CloseReason.CloseCodes.CANNOT_ACCEPT, "Not authorized"));
} catch (IOException e) {
}
}
}
@OnClose
public void close(Session session) {
System.out.println("close");
sessions.remove(session.getId());
}
@OnError
public void onError(Throwable error) {
logger.error("",error);
}
@OnMessage
public void onMessage(final Session session, final Message message) {
System.out.println("onMessage");
String owner = (String)session.getUserProperties().get("owner");
Long appId = message.getAppId();
for (Session s:sessions.values()) {
System.out.println(s);
if (s.isOpen() && (message.isEcho() || s != session) && owner.equals(s.getUserProperties().get("owner")) && (appId == null || appId.equals(s.getUserProperties().get("appId")))) {
s.getAsyncRemote().sendObject(message);
}
}
}
}