2012-03-22 15 views
21

Vorrei sapere come eliminare un cookie in uno HttpServletResponse in Spring MVC. Ho il metodo di accesso in cui creo il cookie e il logout dove voglio eliminarlo, ma non funziona.Elimina cookie da una risposta servlet

Ecco il codice:

@RequestMapping(method = RequestMethod.POST) 
public ModelAndView Login(HttpServletResponse response, String user, String pass) {  
    if (user != null && pass != null && userMapper.Users.get(user).getPass().equals(pass)){ 
     Cookie cookie = new Cookie("user", user); 
     cookie.setPath("/MyApplication"); 
     cookie.setHttpOnly(true); 
     cookie.setMaxAge(3600); 
     response.addCookie(cookie); 
     Map model = new HashMap(); 
     model.put("user", user); 
     return new ModelAndView("home", "model", model); 
    } 
    return new ModelAndView("login"); 
} 

@RequestMapping(value="/logout", method = RequestMethod.POST) 
public ModelAndView Logout(HttpServletRequest request, HttpServletResponse response) {  

     Cookie[] cookies = request.getCookies(); 
     for(int i = 0; i< cookies.length ; ++i){ 
      if(cookies[i].getName().equals("user")){ 
       //Cookie cookie = new Cookie("user", cookies[i].getValue()); 
       //cookie.setMaxAge(0); 
       //response.addCookie(cookie); 
       cookies[i].setMaxAge(0); 
       response.addCookie(cookies[i]); 
       break; 
      } 
     } 
     return new ModelAndView("login"); 
} 

ho pensato che era necessario solo cambiare il maxAge, ma nel browser il cookie non cambiano. Ho anche provato a riscrivere un cookie con lo stesso nome nel blocco commentato ma non funziona neanche.

+0

hai provato cookie.setvalue ("") ?? –

+0

possibile duplicato di [Come si rimuove un cookie in un servlet Java] (http://stackoverflow.com/questions/890935/how-do-you-remove-a-cookie-in-a-java-servlet) – skaffman

+0

sì, il setValue ("") non ha funzionato neanche ... – Cruz

risposta

60

L'impostazione dell'età massima su 0 è corretta. Ma deve avere esattamente le stesse altre proprietà dei cookie, ad eccezione del valore. Quindi esattamente lo stesso dominio, percorso, sicurezza, ecc. Il valore è opzionale, può essere impostato su null.

Quindi, dato il modo in cui si è creato il cookie,

Cookie cookie = new Cookie("user", user); 
cookie.setPath("/MyApplication"); 
cookie.setHttpOnly(true); 
cookie.setMaxAge(3600); 
response.addCookie(cookie); 

ha bisogno di essere rimosso come segue:

Cookie cookie = new Cookie("user", null); // Not necessary, but saves bandwidth. 
cookie.setPath("/MyApplication"); 
cookie.setHttpOnly(true); 
cookie.setMaxAge(0); // Don't set to -1 or it will become a session cookie! 
response.addCookie(cookie); 

Detto questo, io non sono sicuro di come è utile per memorizzare l'utente che ha effettuato l'accesso come cookie. In pratica, stai anche permettendo all'enduser di manipolarne il valore. Piuttosto, basta archiviarlo come attributo di sessione e chiamare lo session.invalidate() al logout.

+0

Grazie, è così, beh lavorerò con questo framework d'ora in poi, e sto solo imparando come funziona, e stavo cercando di capire di usare i cookie qui, ecco perché ho fatto il login tramite utente. – Cruz

+0

"Non sono sicuro di come sia utile memorizzare l'utente che ha effettuato l'accesso come cookie." Forse pertinente se anche tu sei collegato a un sistema Single Sign-On e hai bisogno di "disconnetterti" in modo permanente tramite il suo cookie depositato. – carlosayam

+0

Il valore del percorso era. Ho impostato il cookie con il percorso "/ mywebapp" e successivamente ho provato ad eliminarlo con il percorso "/" root. Non ha funzionato ma ha dovuto usare valori esatti cookie.setPath ("/ mywebapp"), cookie.setMaxAge (0), cookie.setValue (null), response.addCookie (cookie) – Whome

-1

Non è necessario utilizzare il proprio codice. È sufficiente configurare bean RememberMeServices che crei cookie mentre l'utente effettua l'accesso con l'opzione rememberMe e lo eliminerà dopo il logout.

Problemi correlati