2012-01-18 13 views
0

新しいログイン(新しいセッション)とセッションのタイムアウトを区別する方法を教えてもらえますか?
ユーザーのみが認証され、サーブレットにリダイレクトされてユーザーの詳細をロードする必要があります(他の状況では、ユーザーはサーブレットにリダイレクトしないでください)。 およびオンタイムアウトユーザーをタイムアウトページにリダイレクトする必要があります。
新しいセッション(ログインしていないユーザー)を識別するには
- タイムアウト時にセッションがnullになるため、セッション属性を使用できません。
- セッション管理の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; 

以下のアプローチを使用すると、1回目のログイン試行に使用できます。 最初のログインセッションがタイムアウトした後、フィルタはタイムアウトページにリダイレクトされます。 ユーザーがタイムアウト後に同じウィンドウでアプリケーションにアクセスすると、実際の問題が発生します。

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 Serverの

答えて

2

あなたのクッキーのアプローチは不要と技術的に無効です。 0の最大年齢は、応答が処理されると直ちに期限切れになります。しかし、とにかく、追加のクッキーは必要ありません。 HttpSessionはすでにクッキーによってサポートされており、サーブレット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); 
    } 
} 
関連する問題