2008-11-07 8 views
2

Mon application a besoin de stocker l'adresse e-mail des utilisateurs dans un cookie afin que je puisse pré-remplir un formulaire de connexion (username == email address). J'ai défini la valeur du cookie en JavaScript. Si je le lis à partir de JavaScript, je reçois [email protected]. Si je regarde dans la visionneuse de cookies dans Firefox, je reçois [email protected].Lecture d'une chaîne de courriel d'un cookie java

Lorsque je tente de le lire sur le côté serveur en Java cependant, je ne reçois que foo. Dois-je effectuer un codage/décodage ici? Si oui, comment le faire d'une manière qui peut être décodée par JavaScript et Java?

Merci d'avance! -Michael

Répondre

0

Vous devez échapper à la partie de la valeur de votre cookie.

document.cookie = name + "=" +escape(value) 
    + ((expires) ? ";expires=" + expires_date.toGMTString() : "") 
    + ((path) ? ";path=" + path : "") 
    + ((domain) ? ";domain=" + domain : "") 
    + ((secure) ? ";secure" : ""); 
4

De l'javax.servlet.http.Cookie Doco pour setValue (String):

Affecte une nouvelle valeur à un cookie après le cookie est créé. Si vous utilisez une valeur binaire , vous pouvez utiliser l'encodage BASE64 .

Avec la version 0 les cookies, les valeurs ne doivent pas contenir espaces blancs, des crochets, entre parenthèses, signes égal, des virgules, des guillemets doubles, barres obliques, des points d'interrogation, à des signes, côlons, et des points-virgules. Les valeurs vides peuvent ne pas se comporter de la même manière sur tous les navigateurs .

Je devine que vous devez BASE64 encoder sur la manière (via JavaScript) et la sortie (via Java)

+0

S'il vous plaît voir le post ci-dessous sur les égaux signe...(ce qui est avec la limite de 300 caractères sur les commentaires?) – bowmanmc

0

J'ai trouvé deux solutions à cela. Voici la première.

Rembobine les chaînes encodées en Base64. L'inspiration pour cette venue de http://fi.am/entry/urlsafe-base64-encodingdecoding-in-two-lines/

Dans cette solution, le JavaScript reste le même (base64 encodent tout) et le côté serveur ressemble à:

public class CookieDecoder { 

private static final Log log = LogFactory.getLog(CookieDecoder.class); 

/** 
* @param cookieValue The value of the cookie to decode 
* @return Returns the decoded string 
*/ 
public String decode(String cookieValue) { 
    if (cookieValue == null || "".equals(cookieValue)) { 
     return null; 
    } 
    if (!cookieValue.endsWith("=")) { 
     cookieValue = padString(cookieValue); 
    } 
    if (log.isDebugEnabled()) { 
     log.debug("Decoding string: " + cookieValue); 
    } 
    Base64 base64 = new Base64(); 
    byte[] encodedBytes = cookieValue.getBytes(); 
    byte[] decodedBytes = base64.decode(encodedBytes); 
    String result = new String(decodedBytes); 
    if (log.isDebugEnabled()) { 
     log.debug("Decoded string to: " + result); 
    } 
    return result; 
} 

private String padString(String value) { 
    int mod = value.length() % 4; 
    if (mod <= 0) { 
     return value; 
    } 
    int numEqs = 4 - mod; 
    if (log.isDebugEnabled()) { 
     log.debug("Padding value with " + numEqs + " = signs"); 
    } 
    for (int i = 0; i < numEqs; i++) { 
     value += "="; 
    } 
    return value; 
} 
} 

Du côté JavaScript, il vous suffit de vous assurer que vous base64 coder les valeurs:

var encodedValue = this.base64.encode(value); 
document.cookie = name + "=" + encodedValue + 
        "; expires=" + this.expires.toGMTString() + 
        "; path=" + this.path; 
0

la deuxième solution est tout à uRLEncode la chaîne codée base64. J'utilise le codec commun pour faire l'encodage ici. Code Java:

public class CookieDecoder { 

    private static final Log log = LogFactory.getLog(CookieDecoder.class); 

    /** 
    * @param cookieValue The value of the cookie to decode 
    * @return Returns the decoded string 
    */ 
    public String decode(String cookieValue) { 
     if (cookieValue == null || "".equals(cookieValue)) { 
      return null; 
     } 
     if (log.isDebugEnabled()) { 
      log.debug("Decoding string: " + cookieValue); 
     } 
     URLCodec urlCodec = new URLCodec(); 
     String b64Str; 
     try { 
      b64Str = urlCodec.decode(cookieValue); 
     } 
     catch (DecoderException e) { 
      log.error("Error decoding string: " + cookieValue); 
      return null; 
     } 
     Base64 base64 = new Base64(); 
     byte[] encodedBytes = b64Str.getBytes(); 
     byte[] decodedBytes = base64.decode(encodedBytes); 
     String result = new String(decodedBytes); 
     if (log.isDebugEnabled()) { 
      log.debug("Decoded string to: " + result); 
     } 
     return result; 
    } 
} 

Mais maintenant, je dois décoder sur le côté JavaScript et ... Encode:

var encodedValue = this.base64.encode(value); 
document.cookie = name + "=" + escape(encodedValue) + 
        "; expires=" + this.expires.toGMTString() + 
        "; path=" + this.path; 

Decode:

var nameEQ = name + "="; 
var ca = document.cookie.split(';'); 
for(var i = 0; i < ca.length; i++) { 
    var c = ca[i]; 
    while (c.charAt(0)==' ') { 
     c = c.substring(1,c.length); 
    } 
    if (c.indexOf(nameEQ) == 0) { 
     var encodedValue = c.substring(nameEQ.length,c.length); 
     return this.base64.decode(unescape(encodedValue)); 
    } 
} 
return null; 
Questions connexes