2009-05-19 6 views
5

nel nostro servizio web abbiamo impostato un cookie attraverso la quale JavaScript leggiamo ancora in Java (Servlet)Unescape JavaScript sfuggito valore in JAVA

però abbiamo bisogno di sfuggire al valore del cookie perché potrebbe contenere caratteri illegali come '&' che danneggia il cookie.

c'è un modo trasparente di escape (JavaScript) e unescape di nuovo (JAVA) per questo?

grazie, Pieter Goddijn

+0

Definire "modo trasparente". – Cerebrus

risposta

7

in Java che hai StringEscapeUtils da Commons Lang per sfuggire/unescape.

In Javascript si sfugge tramite encodeURIComponent, ma penso che la componente Commons che ho dato a voi soddisferà i vostri bisogni.

+0

Se si desidera decodificare da encodeURIComponent, consultare 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()); 

io aggiungo ulteriori scoperte a my blog entry.

1

Il modo più accurato sarebbe quello di eseguire javascript con il codice java. Spero che il codice qui sotto aiuti.

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

Con il motore nashorn, è possibile scrivere semplicemente: (String) invocable.invokeFunction ("unescape", escapedString); – Shafiul

0

StringEscapeUtils del comune lang non ha funzionato per me.

È possibile utilizzare semplicemente il motore javascript nashorn per scansionare una stringa javascript con 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; 
}