在 Java Servlet 中,如何更改现有 cookie 的值?

Posted

技术标签:

【中文标题】在 Java Servlet 中,如何更改现有 cookie 的值?【英文标题】:In a Java Servlet how can I change the value of an existing cookie? 【发布时间】:2011-11-18 20:02:26 【问题描述】:

有addCookie方法,但是HttpServletResponse中没有deleteCookie和editCookie

【问题讨论】:

【参考方案1】:

那些确实不存在。只需自己创建实用方法即可。特别是获得所需的 cookie 非常臃肿。例如

public final class Servlets 

    private Servlets() 

    public static Cookie getCookie(HttpServletRequest request, String name) 
        if (request.getCookies() != null) 
            for (Cookie cookie : request.getCookies()) 
                if (cookie.getName().equals(name)) 
                    return cookie;
                
            
        

        return null;
    


要编辑 cookie,请设置其值,然后将其添加到响应中:

Cookie cookie = Servlets.getCookie(request, "foo");

if (cookie != null) 
    cookie.setValue(newValue);
    response.addCookie(cookie);

如有必要,设置最大值、路径和域,如果它们与您的默认值不同。客户端即不发回此信息。

要删除 cookie,请将最大年龄设置为 0(最好将值设置为 null):

Cookie cookie = Servlets.getCookie(request, "foo");

if (cookie != null) 
    cookie.setMaxAge(0);
    cookie.setValue(null);
    response.addCookie(cookie);

必要时设置路径和域,如果它们与您的默认值不同。客户端即不发回此信息。

【讨论】:

如果你得到了cookie,设置它,然后再得到它,你得到的是旧cookie还是新cookie? @Sam:在同一个请求中,您当然会得到旧请求。设置的 cookie 仅在后续请求中可用,因为此信息是通过 HTTP 标头传递的。 @BalusC 你知道以这种方式设置 cookie 值是否适用于重定向?似乎更改被忽略了,或者更确切地说,没有在 cookie 的标头表示上传播。在我的例子中,cookie 在重定向的接收端保持不变。欣赏任何想法。 鉴于我上面的评论/问题,我认为答案是通过重定向接收方的过滤器来管理 cookie。即,在过滤器中的 cookie 命中目标 jsp 之前将其移除(使用 HttpServletRequestWrapper 来操作 cookie)。将报告调查结果。【参考方案2】:

这是一个来自kodejava的例子:

 public class ReadCookieExample extends HttpServlet 
 protected void doPost(HttpServletRequest request, HttpServletResponse   response)         throws    ServletException, IOException 
    response.setContentType("text/html");
    PrintWriter writer = response.getWriter();

    Cookie[] cookies = request.getCookies();
    for (int i = 0; i < cookies.length; i++) 
        writer.println("Name: " + cookies[i].getName() + "; Value: "                    +                   cookies[i].getValue());            
    


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws    ServletException, IOException 
    doPost(request, response);

这将得到 cookie 列表,得到你想要的,而不是打印出值,做类似这样的事情:

 cookie.setValue(String.valueOf(<new Value>));  
 cookie.setMaxAge(60*60*24*365);   
 cookie.setPath("/");   
 response.addCookie(cookie);  etc...

HTH,

詹姆斯

【讨论】:

以上是关于在 Java Servlet 中,如何更改现有 cookie 的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在文本文件更改时重新初始化java servlet

如何在 java Servlet 过滤器中更改传入 URL 并将请求重定向到新 URL [重复]

如何在 java 中为 Servlet 上下文添加别名?

如何使用 Eclipse 开发 Java Servlet?

java servlet如何接收其他程序传来的图片和参数!

如何在 SQL 中更改现有表的列长度?