2012-03-22 9 views
21

Spring MVCのHttpServletResponseでクッキーを削除する方法を知りたいと思います。私は、クッキーを作成するログインメソッドと、ログアウトを削除したい場所を持っていますが、動作しません。ここでサーブレットレスポンスからクッキーを削除する

コードです:

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

私は、それが唯一のmaxAgeを変更するために必要なと思ったが、ブラウザでクッキーが変更されません。私はコメントされたブロックで同じ名前のクッキーを書き直そうとしましたが、どちらもうまくいきません。

+0

あなたはcookie.setvalue( "")??を試しましたか? –

+0

[JavaサーブレットでのCookieの削除方法](http://stackoverflow.com/questions/890935/how-do-you-remove-a-cookie-in-a-java-servlet) – skaffman

+0

はい、setValue( "")はどちらも動作しませんでした。 – Cruz

答えて

60

最大年齢を0に設定するのが正しいです。ただし、の正確な値はで、他のCookieプロパティと同じ値を使用する必要があります。したがって、正確に同じドメイン、パス、セキュアな値などです。値は任意で、nullに設定するのが最適です。

だから、あなたはそれが次のように削除する必要が

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

クッキー、作成されたどのような方法与えられた:言っ

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

、私はそれが店に役に立つかどうかはわかりませんがログインしているユーザーをクッキーとして表示します。基本的に、エンドユーザーはその値を操作することもできます。むしろそれを代わりにセッション属性として保存し、ログアウト時にsession.invalidate()と呼んでください。

+0

ありがとうございました、これからはこのフレームワークを使って作業していきます。その仕組みを学んでいます。ここでクッキーを使用することを理解しようとしていたので、ユーザーからログインしました。 – Cruz

+0

"ログインしているユーザーをクッキーとして保存することがどのように役立つかわかりません。"シングルサインオンシステムにもリンクされていて、預金したクッキーを使用してユーザーを永久に「ログアウト」する必要がある場合、関連性があります。 – carlosayam

+0

パスの値はそれでした。私は "/ mywebapp"パスでクッキーを設定し、後で "/"ルートパスでそれを削除しようとしました。これは動作しませんでしたが、正確な値を使用する必要がありました。cookie.setPath( "/ mywebapp")、cookie.setMaxAge(0)、cookie.setValue(null)、response.addCookie(cookie) – Whome

-1

独自のコードを使用する必要はありません。 RememberMeオプションでログインしている間にクッキーを作成するrememberMeServices beanを設定するだけで、ログアウト後に削除されます。

関連する問題