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