2012-10-29 19 views
6

ログイン(私を覚えている)アプリケーションを実装しようとしていますが、私はクッキーを管理するのに問題があります。私は(新しいメンバーのために)登録をしているか、(既に登録されているメンバーのために)ログインしていたとき、私は、サーバーでやってる:ログイン、私を覚えているアプリケーション、javaサーブレットとjspを使用

応答は、私は、ブラウザから取得しています
Cookie returnVisitorCookie = new Cookie("repeatVisitor", "yes"); 
returnVisitorCookie.setMaxAge(60*60*24*365); // 1 year 
response.addCookie(returnVisitorCookie); 

。たとえば、visitor.login(レスポンス)。

私がSIGNOUTをしているとき、私はそのクッキーを削除します。しかし、それは私が2人のメンバーとサインアウトを登録した場合、私はまだ名前= "repeatVisitor"と値= "はい"のクッキーを持っていることを意味する必要があるより多くのクッキー を持っているようです。

おそらく、私は異なるレスポンスでクッキーを入れているからです。

誰でも私に間違っていることを教えてもらえますが、どうすれば実装できますか? ありがとう

+1

このCookieを設定する場合、ログアウトせずに2人のユーザーを登録するにはどうすればよいですか?設定を解除する前に複数回設定しているように思えます。これは可能ではありません。すでにログインしているときにログインしていることを意味します。 –

+2

@PWhite既にログインしていてもログインしていても、上記のコードは既存のCookieを上書きします。 – doublesharp

+0

私はJavaがクッキーを扱う方法に慣れていないので、私は答えを投稿していません。私はそれが他のバックエンド言語にも当てはまることを知っています。 –

答えて

0

repeatVisitor次のリクエストには少なくとも1年間はCookieが存在し続けますが、クライアントのブラウザには「1年間Cookieを有効にしてください」と指示されています。後続のリクエストヘッダからクッキーを削除しても、ブラウザは単にそれを再追加するだけではありません。

に成功私を覚えて実装するには、

  1. セキュアトークン、ではない「:はいリピートユーザーを」言うだけフラグを使用する必要があります。あなたがあたりに生成されたセキュアトークンを積極

  2. に対処管理するために、誰かがちょうど要求をインターセプトし、ヘッダに何かを入れないように、一意にしっかりと訪問者を識別するためにjava's UUID classのようなものを使用して独自のトークンを生成ユーザー。つまり、生成したトークンをいくつかの永続ストレージに格納し、このストアに対する繰り返し要求をチェックします。トークンの有効期限などを管理するのはこのストア内です。だからあなたの永続ストアでは、フラグトークンを非アクティブとしてすることができますかは、別の方法として

を満了し、簡単に私を覚えてルートを設定することで、あなたを覚えて、私はあなたが今設定しますそのために一定の時間間隔にHttpServletRequestオブジェクトのCookieの有効期限。つまり、remember me for 2 weeksというチェックボックスが表示され、Cookieの有効期限が2週間に設定されます。同じCookieトークンの後続の表現は、ストレスなく自動的に管理されます。

1

私はたまには、例を見て勉強したり理解したりする最善の方法を見つけることがあります。ここでは、作業のウェブサイトに使用するいくつかのコードは次のとおりです。

@WebServlet(name = "Login", urlPatterns = {"/authorization/Login"}) 
public class Login extends HttpServlet { 

    /** 
    * Processes requests for both HTTP 
    * <code>GET</code> and 
    * <code>POST</code> methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 

     PrintWriter out = response.getWriter(); 
     try { 
      System.out.println("Reached login"); 
      if (!Authorization.isLoggedIn(request)) { 
       String login = request.getParameter("login"); 
       String password = request.getParameter("password"); 
       boolean remember = Boolean.parseBoolean(request.getParameter("remember")); 

       System.out.println("Reached login "+login+", "+password+","+remember); 
       if (!Authorization.validateLogin(login, password)) { 
        Logger.getLogger(Login.class.getName()).log(Level.INFO, 
          "Failed login (invalid password) from {0} for {1}", 
          new String[]{request.getRemoteAddr(), login}); 
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid username or password!"); 
        return; 
       } 
       //So far so good... Get the user object from the database (unique login names) 
       DB_User user = DB_User.get(login); 
       if (!user.getActive()) { 
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Your account is no longer active!"); 
        return; 
       } 
       String sessionID = Authorization.createNewSession(user, request.getRemoteAddr(), remember); 
       Cookie sessionCookie = new Cookie("my_application.session_id", sessionID); 
       sessionCookie.setDomain(request.getServerName()); 
       sessionCookie.setPath(request.getContextPath()); 
       if (remember) { 
        sessionCookie.setMaxAge(ServerConfig.getLoginSessionTimeout()); 
       } 

       response.addCookie(sessionCookie); 
      } 
      response.sendRedirect("/app/myAccount.jsp"); 
     } catch (Throwable ex) { 
      Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex); 
      ServletUtils.handleException(ex, response); 
     } finally { 
      out.flush(); 
      out.close(); 
     } 
    } 

    // +HttpSerlet default methods here. (doGet, doPost, getServletInfo) 
} 

ログアウトサーブレットの例:

@WebServlet(name = "Logout", urlPatterns = {"/authorization/Logout"}) 
public class Logout extends HttpServlet { 

    /** 
    * Processes requests for both HTTP 
    * <code>GET</code> and 
    * <code>POST</code> methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      String sessionID = ServletUtils.getCookieValue(request.getCookies(),"my_application.session_id"); 

      if (sessionID != null) { 
       SQLManager sql = ServerConfig.getSql(); 
       sql.deleteFromTable("login_session", "session_id = " + SQLString.toSql(sessionID)); 

       Cookie sessionCookie = new Cookie("my_application.session_id", null); 
       sessionCookie.setDomain(ServletUtils.getCookieDomain(request)); 
       sessionCookie.setPath("/you_app_name"); 
       sessionCookie.setMaxAge(0); 
       response.addCookie(sessionCookie); 
      } 
      response.sendRedirect("/security/login.jsp"); 

     } catch (Throwable ex) { 
      Logger.getLogger(Logout.class.getName()).log(Level.SEVERE, null, ex); 
      ServletUtils.handleException(ex, response); 
     } finally { 
      out.close(); 
     } 
    } 
} 

あなたは気づくでしょうとして私たちが作ってきたが、概念はそれにもかかわらず、そこにあるいくつかのヘルパークラスがあります。これが役に立ちますようにお願いします

関連する問題