2009-05-19 8 views
5

w naszym serwisie internetowym możemy ustawić plik cookie poprzez wich JavaScript ponownie przeczytać w Java (serwletu)unescape JavaScript uciekł wartość w JAVA

jednak musimy uciec wartość cookie, ponieważ może zawierać niedozwolone znaki takie jak "&", który uruchamia plik cookie.

Czy istnieje przejrzysty sposób, aby uciec (JavaScript) i ponownie unescape (JAVA) do tego?

Dzięki, Pieter Goddijn

+0

Określenie "przeźroczystej drogi". – Cerebrus

Odpowiedz

7

w Javie dostałeś StringEscapeUtils z Commons Lang uciec/unescape.

W JavaScript uciekasz przez encodeURIComponent, ale myślę, że element Commons, który ci dałem, zaspokoi twoje potrzeby.

+0

Jeśli chcesz dekodować z encodeURIComponent zobacz tutaj http://stackoverflow.com/questions/607176/java-equivalent-to-javascripts-encodeuricomponent-that-produces-identical-outpu – reevesy

4

Client JavaScript/ECMAScript:

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

Server Java:

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

dodam kolejne odkrycia do my blog entry.

1

Najbardziej dokładny sposób to Excecute javascript z twoim kodem java. Mam nadzieję, że poniższy kod pomoże.

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()}); 
+0

Z silnikiem nashorn, możesz po prostu napisać: (String) invocable.invokeFunction ("unescape", escapedString); – Shafiul

0

StringEscapeUtils Common Langa nie działa dla mnie.

Możesz po prostu użyć silnika javascript nashorn, aby odblokować ciąg znaków javascript z sekwencjami escape.

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; 
} 
Powiązane problemy