有人可以让我知道如何区分新登录(新会话)和会话超时
仅在登录时:必须对用户进行身份验证并将其重定向到servlet以加载用户详细信息(在其他screnarios上,用户不得重定向到servlet)
并且在超时时必须将用户重定向到超时页面
识别新会话(用户未登录):
- 由于会话在超时时变为空,因此无法使用会话属性
- 为会话管理设置cookie无效。
当前会话中的cookie已被删除
Cookie cookie = new Cookie("activeSession", null);
cookie.setMaxAge(0);
cookie.setPath("/");
cookie.setValue("");
httpServletResponse.addCookie(cookie);
getCookieValue(httpServletRequest , "activeSession"); returns null
public static String getCookieValue(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie != null && name.equals(cookie.getName())) {
return cookie.getValue();
}
}
}
return null;
}
当用户登录并创建新会话时,注销或超时(会话失效)后。 之前会话中删除的Cookie将重新显示预设值。
getCookieValue(httpServletRequest , "activeSession") returns a value;
如果我使用以下方法,它适用于第一次登录尝试。 在第一次登录会话超时后,过滤器会重定向到超时页面。 当用户在超时后访问同一窗口中的应用程序时,会出现实际问题。
public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException,
{ if ((request instanceof HttpServletRequest)
&& (response instanceof HttpServletResponse)) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
//Check for a new login
if (httpServletRequest.getSession(false) == null && httpServletRequest.getRequestedSessionId()==null)
{
// Create a new session
httpServletRequest.getSession();
//Redirect to servlet on 1 st login to fetch details from DB
httpRequest.getRequestDispatcher("/loginServlet").forward(request,response);
}else{
//validate active or timedout sessions.
boolean isSessionValid = (httpServletRequest.getRequestedSessionId() != null) && !httpServletRequest.isRequestedSessionIdValid();
if(isSessionValid)
{
httpServletResponse.sendRedirect(getTimeoutPage());
}
}
}
filterChain.doFilter(request, response);
}
因此,不会从DB中提取详细信息,并且页面未正确加载。
浏览器:IE 8 服务器:Weblogic服务器
答案 0 :(得分:2)
您的Cookie方法是不必要的,技术上无效。最大年龄0
会使其在处理响应时立即过期。但无论如何,您不需要额外的cookie。 HttpSession
本身已经由cookie支持,并且Servlet API已经提供了检查一个和另一个的方法。只需将登录用户存储为HttpSession
的属性(后者可以是会话范围的JSF托管bean)。
以下示例应该这样做,假设您已将登录用户存储为具有托管bean名称“auth”的会话范围JSF托管bean的属性。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
Authenticator auth = (Authenticator) req.getSession().getAttribute("auth");
if (req.getRequestedSessionId() != null && !req.isRequestedSessionIdValid()) {
res.sendRedirect(req.getContextPath() + "/timeout.xhtml");
} else if (auth == null || !auth.isLoggedIn()) {
res.sendRedirect(req.getContextPath() + "/login.xhtml");
} else {
chain.doFilter(request, response);
}
}