Un-escape JavaScript избежало значения в Java - PullRequest
5 голосов
/ 19 мая 2009

В нашем веб-сервисе мы устанавливаем cookie через JavaScript, который мы снова читаем на Java (сервлет)

Однако нам нужно избегать значения cookie, потому что оно может содержать недопустимые символы, такие как «&», которые портят cookie.

Есть ли для этого прозрачный способ выхода (JavaScript) и повторного удаления (Java)?

Ответы [ 4 ]

7 голосов
/ 19 мая 2009

В Java вы получили StringEscapeUtils из Commons Lang , чтобы убежать / скрыться.

В Javascript вы используете encodeURIComponent , но я думаю, что компонент Commons, который я вам предоставил, удовлетворит ваши потребности.

4 голосов
/ 23 февраля 2012

Клиентский JavaScript / ECMAScript:

encodeURIComponent(cookie_value) // also encodes "+" and ";", see http://xkr.us/articles/javascript/encode-compare/

Сервер Java:

String cookie_value = java.net.URLDecoder.decode(cookie.getValue());

Я добавлю новые открытия в мою запись в блоге .

1 голос
/ 29 октября 2016

StringEscapeUtils общего языка не работает для меня.

Вы можете просто использовать javascript nashorn engine, чтобы освободить экранированную строку javascript.

private String decodeJavascriptString(final String encodedString) {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    Invocable invocable = (Invocable) engine;
    String decodedString = encodedString;
    try {
        decodedString = (String) invocable.invokeFunction("unescape", encodedString);

    } catch (ScriptException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }

    return decodedString;
}
1 голос
/ 28 октября 2014

Самый точный способ состоит в том, чтобы выполнить Excecute javascript вместе с вашим java-кодом. Надеюсь, что приведенный ниже код поможет.

ScriptEngineManager factory = new ScriptEngineManager();
   ScriptEngine engine = factory.getEngineByName("JavaScript");
   ScriptContext context = engine.getContext();
   engine.eval("function decodeStr(encoded){"
             + "var result = unescape(encoded);"
             + "return result;"
             + "};",context);

     Invocable inv;   

    inv = (Invocable) engine;
    String res =  (String)inv.invokeFunction("decodeStr", new Object[]{cookie.getValue()});
...