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

在 Java Servlet 中,如何更改现有 cookie 的值?有addCookie方法,但是HttpServletResponse中没有deleteCookie和editCookie

【问题讨论】:

    标签: java servlets cookies


    【解决方案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,

    詹姆斯

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 2013-08-14
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多