Jsf 如何区分新登录(新会话)和会话超时

Jsf 如何区分新登录(新会话)和会话超时,jsf,session-timeout,Jsf,Session Timeout,有人能告诉我如何区分新登录(新会话)和会话超时。 仅在登录时:用户必须经过身份验证并重定向到servlet才能加载用户详细信息(在其他screnarios上,用户不得重定向到servlet) 在超时时,必须将用户重定向到超时页面。 要识别新会话(用户未登录): --由于会话在超时时变为空,因此无法使用会话属性。 --为会话管理设置Cookie无效。 正在删除当前会话的Cookie Cookie cookie = new Cookie("activeSession", null); cookie.

有人能告诉我如何区分新登录(新会话)和会话超时。
仅在登录时:用户必须经过身份验证并重定向到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; 
如果我使用下面的方法,它适用于第一次登录尝试。 在第一次登录会话有timedout之后,过滤器重定向到timeout页面。 当用户在超时后在同一窗口中访问应用程序时,实际问题就会出现

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);
}
因此,没有从数据库中获取详细信息,页面也没有正确加载

浏览器:IE 8
服务器:Weblogic服务器

您的cookie方法是不必要的,并且在技术上是无效的。最大期限
0
使其在处理响应时立即过期。但无论如何,你不需要额外的饼干。
HttpSession
本身已经有了cookie的支持,Servlet API已经提供了检查其中一个和另一个的方法。只需将登录用户存储为
HttpSession
的一个属性(它可以是会话范围的JSF托管bean)

下面的示例应该这样做,假设您已将登录用户存储为会话范围的JSF托管bean的属性,托管bean名称为“auth”

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);
    }
}