2012-10-29 26 views
6

Próbuję zaimplementować aplikację do logowania (zapamiętaj mnie) i mam problem z zarządzaniem plikami cookie. kiedy robię rejestru (dla nowych członków) lub logowania (dla członków, które już zostały zarejestrowane) robię na serwerze:logowanie, zapamiętaj mnie, aplikacja korzystająca z serwletu java i jsp

Cookie returnVisitorCookie = new Cookie("repeatVisitor", "yes"); 
returnVisitorCookie.setMaxAge(60*60*24*365); // 1 year 
response.addCookie(returnVisitorCookie); 

gdzie odpowiedź Dostaję od przeglądarce. na przykład: visitor.login (odpowiedź).

Kiedy robię SIGNOUT, usuwam plik cookie. ale wygląda na to, że mam więcej ciasteczek, to powinno być, to znaczy jeśli zarejestrowałem 2 członków i się wylogowałem, nadal mam ciasteczka o nazwie = "repeatVisitor" i value = "yes".

Może dlatego, że umieszczam plik cookie w różnych odstępach czasu.

Ktoś może dać mi idę, co robię źle i jak mam to wdrożyć? Dziękujemy

+1

Jeśli wybierasz ten plik cookie, w jaki sposób możesz zarejestrować dwóch użytkowników bez konieczności wylogowywania? Wygląda na to, że ustawiasz je wiele razy przed odbiorem, co nie powinno być możliwe - co oznaczałoby, że logujesz się, gdy jesteś już zalogowany. –

+2

@PWhite, nawet jeśli logowałeś się już po zalogowaniu, powyższy kod po prostu zastąpiłby istniejący plik cookie. – doublesharp

+0

Nie jestem zaznajomiony z tym, jak Java zajmuje się plikami cookie, dlatego nie opublikowałem odpowiedzi. Wiem, że to prawda w innych językach backendowych. –

Odpowiedz

0

Będziesz mieć plik cookie repeatVisitor obecny w kolejnych żądaniach przez co najmniej rok, poinstruowałeś przeglądarkę klienta, aby to zrobił, "zachowaj plik cookie przez rok". Usunięcie pliku cookie z kolejnych nagłówków żądań nie powstrzyma przeglądarki przed ponownym jej dodaniem.

celu realizacji zapamiętaj mnie pomyślnie, trzeba

  1. Używaj bezpiecznego tokenu, nie tylko flagę z napisem „repeat użytkownik: yes”. Wygenerować unikalny token użyciu coś podobnego java's UUID class jednoznacznie zidentyfikować gościa bezpiecznie, więc ktoś po prostu nie przechwytuje żądania i umieścić coś w nagłówku, aby radzić sobie z

  2. aktywnie zarządzanie bezpiecznym wygenerowany za żeton użytkownik. Oznacza to, że przechowujesz wygenerowany token w trwałym magazynie i sprawdza prośby o powtórzenie w odniesieniu do tego sklepu. To w tym sklepie będziesz zarządzać wygaśnięciem tokena i tak dalej. Więc w przetrwałym sklepie, możesz zgłosić token jako nieaktywne lub wygasł

Jako alternatywa, tym łatwiej zapamiętaj mnie trasa jest ustawienie pamiętać-mi ustalonym czasie trwania, dla którego będziesz teraz ustawić data ważności pliku cookie w obiekcie HttpServletRequest. Oznacza to, że będziesz mieć swoje pole wyboru mówiąc: remember me for 2 weeks, a następnie ustawić datę ważności pliku cookie na 2 tygodnie. Kolejne reprezentacje tego samego tokena cookie będą automatycznie zarządzane bez stresu.

1

Czasami najlepszym sposobem na naukę lub zrozumienie jest znalezienie przykładu. Oto kod, którego używamy do działającej witryny:

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

Wyloguj przykład aplet:

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

Istnieje kilka klas pomocników mamy wykonane jak można zauważyć, ale koncepcja jest tam jednak. Mam nadzieję, że to pomoże

Powiązane problemy