从 servlet 响应中删除 cookie

Posted

技术标签:

【中文标题】从 servlet 响应中删除 cookie【英文标题】:Delete cookie from a servlet response 【发布时间】:2012-04-06 23:49:55 【问题描述】:

我想知道如何在 Spring MVC 中删除 HttpServletResponse 中的 cookie。我有创建 cookie 的登录方法和要删除它的注销方法,但它不起作用。

代码如下:

@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,但在浏览器中cookie 不会更改。我什至尝试在注释块中重写一个同名的cookie,但它也不起作用。

【问题讨论】:

你试过 cookie.setvalue("") 吗?? How do you remove a Cookie in a Java Servlet的可能重复 是的,setValue("") 也不起作用... 带有new Cookie()的注释代码应该可以工作,除了设置相同的cookie域。 【参考方案1】:

将最大年龄设置为0 是正确的。但它必须具有完全相同相同的其他 cookie 属性,但值除外。因此域、路径、安全等完全相同。该值是可选的,最好设置为null

所以,鉴于您创建 cookie 的方式,

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

也就是说,我不确定将登录用户存储为 cookie 有什么用处。您基本上还允许最终用户操纵其价值。而是将其存储为会话属性,并在注销时调用 session.invalidate()

【讨论】:

谢谢,就是这样,从现在开始我将使用这个框架,我只是在学习它是如何工作的,我试图理解在这里使用 cookie,这就是我制作通过用户登录。 “我不确定将登录用户存储为 cookie 有什么用处。”如果您还链接到单点登录系统并且需要通过其存放的 cookie 永久“注销”用户,则可能相关。 路径值就是它。我用“/mywebapp”路径设置cookie,后来尝试用“/”根路径删除它。它不起作用,但必须使用确切的值 cookie.setPath("/mywebapp")、cookie.setMaxAge(0)、cookie.setValue(null)、response.addCookie(cookie) 也适用于会话 cookie?最初存储时没有最大年龄的那些?还是它们的过期时间仅由浏览器控制?【参考方案2】:

无需使用您自己的代码。只需配置rememberMeServices bean,它会在用户登录并选中rememberMe 选项时创建cookie,并在注销后将其删除。

【讨论】:

以上是关于从 servlet 响应中删除 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Servlet 2.3 或 2.5 中的响应中获取标头

NSURLSession 从 Servlet 获取响应

如何从 servlet 将文本响应流式传输到 jsp?

处理servlet中的多个请求,并为每个请求提供正确的响应

什么是Servlet?

Servlet的概述