2011-02-23 22 views
6

Tengo una cookie, myCookie, que contiene un valor hash. Esta cookie expira en un año y tiene una ruta de '/'. Necesito actualizar esta cookie con un nuevo valor hash. Cuando se carga mi script JSP puedo recuperar la cookie de este modo:¿Cómo se actualiza una cookie existente en JSP?

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

Después de determinar que el valor de la cookie necesita ser actualizado, hago lo siguiente para actualizarlo:

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

El examen de la resultados, ahora tengo dos instancias de myCookie: la versión original con la fecha de caducidad correcta y la ruta, y el valor anterior, no válido; y una nueva cookie llamada "myCookie" que expira al final de la sesión, con el valor correcto y una ruta del documento JSP.

Si hago:

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

Lo mismo sucede. Recibo dos cookies con el mismo nombre y diferentes propiedades.

¿El objeto Cookie no retiene las propiedades desde el momento en que se recuperó? ¿Cómo puedo actualizar esta cookie?

Nota: No deseo modificar la ruta ni la fecha de caducidad. Solo quiero actualizar el valor de la cookie ya configurada.

+0

echar un vistazo a: http://stackoverflow.com/questions/4863740/change-cookie-expiry-date- http – Ralph

+0

@Ralph, ¿cómo se supone que eso me ayuda? –

+0

¿Su dominio y ruta son los mismos? – Ralph

Respuesta

8

Según la sección 3.3.4 del RFC 2965, el agente de usuario no incluye la información de caducidad en el encabezado de la cookie que se envía al servidor. Por lo tanto, no hay forma de actualizar el valor de una cookie existente conservando la fecha de caducidad que se estableció inicialmente basándose únicamente en la información asociada con la cookie.

Así que la respuesta a esta pregunta es: no se puede hacer eso.

1

Si está manipulando cookies dentro de un JSP, una cosa que deberá tener en cuenta es si la respuesta ya se ha confirmado o no. Una vez que el contenido se escribe en la secuencia de salida, agregar una cookie a la respuesta es inútil.

ServletResponseWrapper.isCommitted()

+0

Gracias. No agrego la cookie después de enviar ningún contenido. Toda mi validación de cookies se realiza antes de que se envíe algo al cliente. –

2

acaba de establecer la ruta, por ejemplo:

cookie.setPath("/"); 

Esto debería sobrescribir el valor de la cookie de edad.

0
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) 
    } 

el código anterior puede ayudar a agregar una galleta y actualizar el valor de la cookie

+0

1) Consulte la respuesta aceptada para saber por qué no es posible actualizar una cookie existente. 2) Su código definitivamente no es JSP. 3) Su código es claramente específico de su aplicación (¿Usuario secundario? ¿De dónde vino eso y cómo se relaciona con esta pregunta?) –

Cuestiones relacionadas