我不認爲有這樣做的構建方式,因爲那時容器需要記住過期的sessionIds及其關聯的用戶。據我所知容器只會在會話超時時刪除這些信息。 但是您可以嘗試自行完成此操作:
實施HttpSessionListener並將過期的SessionID存儲在某種緩存中。很可能您只想向授權用戶顯示「您的會話過期」消息,但也可以爲非授權用戶創建HTTP會話。所以你需要檢查用戶是否被授權。由於您無權訪問SessionListener中的UserPrincipal,因此您需要在會話中自行存儲一些信息。
@WebListener
public class HttpSessionChecker implements HttpSessionListener {
@Inject
private SessionIdCache cache;
public void sessionCreated(HttpSessionEvent event) {}
public void sessionDestroyed(HttpSessionEvent event) {
if (event.getSession().getAttribute("someAuthInformation") != null) { // whatever you've stored
cache.put(event.getSession().getId(), new Date());
}
}
}
在你ExceptionMapper你現在可以檢查是否有JSESSIONID cookie的是請求頭的一部分,如果傳遞的會話ID是在緩存中。
@Provider
public class ExMapper implements ExceptionMapper<Exception> {
@Inject
private SessionIdCache cache;
@Context
private HttpServletRequest request;
@Override
public Response toResponse(Exception ex) {
for (Cookie cookie : request.getCookies()) {
if ("JSESSIONID".equals(cookie.getName())) {
String sessionId = cookie.getValue().substring(0, cookie.getValue().lastIndexOf('.')); // ignore .hostname
if (cache.contains(sessionId)) {
return Response.serverError().entity("Your session timed out").build();
}
}
}
return Response.serverError().build();
}
}
您應該考慮不時清理緩存。
感謝您的迴應,但我找到了更好的解決方案:) –