我有一个带有两个不同 servlet 的码头容器,然后调用 A 和 B。在特殊情况下,servlet A(用户已经登录并正在使用他的桌面)和用户使用他的移动设备出现二维码阅读此二维码并在其移动设备上重定向 servlet B。这里的问题是我不能保持他的会话。
二维码带来了用户会话密钥,但是我无法验证此会话是否有效。我想知道是否有任何特殊方法可以在码头上请求有效的会话密钥,因为两个 servlet 都在同一个服务器中。
我有一个带有两个不同 servlet 的码头容器,然后调用 A 和 B。在特殊情况下,servlet A(用户已经登录并正在使用他的桌面)和用户使用他的移动设备出现二维码阅读此二维码并在其移动设备上重定向 servlet B。这里的问题是我不能保持他的会话。
二维码带来了用户会话密钥,但是我无法验证此会话是否有效。我想知道是否有任何特殊方法可以在码头上请求有效的会话密钥,因为两个 servlet 都在同一个服务器中。
那么我找到的最好的解决方案是建立一个 HttpSessionListener :) 我们必须重写一些方法:
public class HttpSessionCollector implements HttpSessionListener {
private static final Map<String, HttpSession> sessions = new HashMap<String, HttpSession>();
@Override
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
sessions.put(session.getId(), session);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
sessions.remove(event.getSession().getId());
}
public static HttpSession find(String sessionId) {
return sessions.get(sessionId);
}
public static Map<String, HttpSession> getSessions() {
return sessions;
}
}
然后在 /WEB-INF/web.xml 上设置监听器
<web-app>
<listener>
<listener-class>[yourpack].HttpSessionCollector</listener-class>
</listener>
...
</web-app>
现在我们可以在包内的任何地方调用 HttpSessionCollector。例如,要获得所有有效会话,我们只需:
private Map<String, HttpSession> sessions;
sessions=HttpSessionCollector.getSessions();