Чтение строки электронной почты из куки в Java - PullRequest
3 голосов
/ 07 ноября 2008

Моему приложению необходимо сохранить адрес электронной почты пользователя в файле cookie, чтобы я мог предварительно заполнить форму входа (username == email address). Я установил значение cookie в JavaScript. Если я читаю это из JavaScript, я получаю foo@bar.com. Если я смотрю на это в программе просмотра файлов cookie в Firefox, я получаю foo@bar.com.

Когда я пытаюсь прочитать его на стороне сервера в Java, я получаю только foo.

Нужно ли здесь выполнять какое-то кодирование / декодирование? Если так, то как мне сделать это так, чтобы можно было декодировать как JavaScript, так и Java?

Заранее спасибо! -Michael

Ответы [ 4 ]

4 голосов
/ 07 ноября 2008

Из javax.servlet.http.Cookie документ для setValue (String):

Назначает новое значение cookie после печенье создано. Если вы используете двоичное значение, вы можете использовать Кодировка BASE64.

с версией 0 куки, значения не должны содержать пробел, скобки, скобки, знаки равенства, запятые, двойные кавычки, косые черты, вопросительные знаки, при знаках , двоеточия и точки с запятой. Пустые значения может не вести себя одинаково на всех браузеры.

Полагаю, вам нужно кодировать BASE64 по дороге (через JavaScript) и по дороге (через Java)

0 голосов
/ 07 ноября 2008

Второе решение состоит в том, чтобы просто URLE закодировать строку в кодировке Base64. Я использую кодек Commons для кодирования здесь. 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;
    }
}

Но теперь я должен декодировать его и на стороне JavaScript ... Кодировать:

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;
0 голосов
/ 07 ноября 2008

Я нашел два решения для этого. Вот первый.

Добавить обратно в дополнение к закодированным Base64 строкам. Вдохновение для этого пришло от http://fi.am/entry/urlsafe-base64-encodingdecoding-in-two-lines/

В этом решении JavaScript остается прежним (base64 все кодирует), а сторона сервера выглядит следующим образом:

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

Что касается JavaScript, вам просто нужно убедиться, что Base64 кодирует значения:

var encodedValue = this.base64.encode(value);
document.cookie = name + "=" + encodedValue + 
                  "; expires=" + this.expires.toGMTString() + 
                  "; path=" + this.path;
0 голосов
/ 07 ноября 2008

Вам необходимо экранировать часть значения вашего cookie.

document.cookie = name + "=" +escape( value ) 
    + ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" )
    + ( ( path ) ? ";path=" + path : "" ) 
    + ( ( domain ) ? ";domain=" + domain : "" ) 
    + ( ( secure ) ? ";secure" : "" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...