【问题标题】:How do you update an existing cookie in JSP?如何更新 JSP 中的现有 cookie?
【发布时间】:2011-07-02 20:53:03
【问题描述】:

我有一个 cookie,myCookie,它包含一个哈希值。此 cookie 设置为一年后过期,路径为“/”。我需要用新的哈希值更新这个 cookie。当我的 JSP 脚本被加载时,我会像这样检索 cookie:

Cookie[] cookies = request.getCookies();
Cookie myCookie = null;

for (int i = 0; i < cookies.length; i += 1) {
  if (cookies[i].getName().equals("myCookie")) {
    myCookie = cookies[i];
    break;
  }
}

确定cookie的值需要更新后,我做如下更新:

myCookie.setValue("my new value");
response.addCookie(myCookie);

检查结果,我现在有两个myCookie 实例:具有正确到期日期和路径的原始版本,以及旧的无效值;以及一个名为“myCookie”的新 cookie,该 cookie 在会话结束时过期,具有正确的值和 JSP 文档的路径。

如果我这样做:

myCookie.setValue("my new value");
myCookie.setPath(myCookie.getPath());
myCookie.setMaxAge(myCookie.getMaxAge());
response.addCookies(myCookie);

同样的事情发生了。我得到了两个具有相同名称和不同属性的 cookie。

Cookie 对象是否不保留检索时的属性?如何更新此 cookie?

注意:我不想修改路径或到期日期。我只想更新已经设置好的cookie的值。

【问题讨论】:

标签: java jsp cookies


【解决方案1】:

如果新的 cookie 不包含相同的名称、路径和域,您可以删除旧的 cookie,方法是将 MaxAge 设置为 (0) http://download.oracle.com/javaee/1.3/api/javax/servlet/http/Cookie.html#setMaxAge(int)

【讨论】:

    【解决方案2】:

    根据RFC 2965 的第 3.3.4 节,用户代理不会在发送到服务器的 cookie 标头中包含过期信息。因此,无法在更新现有 cookie 的值的同时保留最初仅基于与 cookie 关联的信息设置的到期日期。

    所以这个问题的答案是:你不能那样做。

    【讨论】:

      【解决方案3】:

      如果您在 JSP 中操作 cookie,您需要注意的一件事是响应是否已经提交。将内容写入输出流后,在响应中添加 cookie 是徒劳的。

      ServletResponseWrapper.isCommitted()

      【讨论】:

      • 谢谢。发送任何内容后,我没有添加 cookie。在将任何内容发送到客户端之前,我的所有 cookie 验证都已完成。
      【解决方案4】:

      只需设置路径,例如:

      cookie.setPath("/");
      

      这应该会覆盖旧的 cookie 值。

      【讨论】:

        【解决方案5】:
        def member = SecUser.get(userService.currentUser().id)
            def cookies = request.getCookies()
            def cookie;
            def sum = 0;
            def cookieSum = 0;
            def cookieItems;
            for(def i=0; i<cookies.size(); i++){
                if (cookies[i].name == 'c17'){
                        cookie = cookies[i]
                        cookieItems = cookie.value.split('-')
                        println "cookieItems......."+cookieItems
                        if(params.itemId != null){
                            for(def j=0; j<cookieItems.size(); j++){
                                def oldItem = cookieItems[j].split('\\|')[0]
                                if(params.itemId != oldItem){
                                    sum = sum + 1
                                }
                            }//Below code for Update your cookie value
                        if(sum == cookieItems.size()){
                            cookie.value = cookie.value +"-"+params.itemId+"|"+member.id
                            def b = cookie.value
                            cookie.setValue(b);
                            response.addCookie(cookie);
        
                        }
                        }
                        break
                  }
                  else{
                     cookieSum = cookieSum + 1
                  }
        
             }
            if ((cookieSum) == cookies.size()){
                // Here ADD new cookie........
                 def a = params.itemId+"|"+member.id
                 cookie = new Cookie('c17',a.toString())
                 cookie.path = '/'
                 response.addCookie(cookie)
            }
        

        以上代码可以帮助您添加 cookie 并更新 cookie 值

        【讨论】:

        • 1) 请参阅接受的答案,了解为什么无法更新现有 cookie。 2) 你的代码绝对不是 JSP。 3)您的代码显然特定于您的应用程序(SecUser?它来自哪里,它与这个问题有什么关系?)
        猜你喜欢
        • 2012-03-10
        • 2017-06-13
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        相关资源
        最近更新 更多