2009-05-19 32 views
5

phục vụ web của chúng tôi, chúng tôi thiết lập một cookie qua Mà Javascript chúng ta đọc một lần nữa trong Java (Servlet)unescape Javascript thoát giá trị trong JAVA

tuy nhiên chúng tôi cần phải thoát khỏi giá trị của cookie vì nó có thể chứa các ký tự bất hợp pháp như '&' sẽ làm hỏng cookie.

là có một cách minh bạch để thoát (JavaScript) và unescape một lần nữa (JAVA) cho điều này?

cảm ơn, Pieter Goddijn

+0

Xác định "đường trong suốt". – Cerebrus

Trả lời

7

Trong java bạn có StringEscapeUtils từ Commons Lang để thoát/unescape.

Trong Javascript bạn thoát qua encodeURIComponent, nhưng tôi nghĩ rằng thành phần Commons mà tôi đã cung cấp cho bạn sẽ đáp ứng nhu cầu của bạn.

+0

Nếu bạn muốn giải mã từ encodeURIComponent xem tại đây http://stackoverflow.com/questions/607176/java-equivalent-to-javascripts-encodeuricomponent-that-produces-identical-outpu – reevesy

4

Khách hàng Javascript/ECMAScript:

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

máy chủ Java:

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

Tôi sẽ thêm những khám phá hơn nữa để my blog entry.

1

Cách chính xác nhất sẽ là Khai thác javascript bằng mã java của bạn. Hy vọng mã dưới đây sẽ giúp.

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

Với động cơ nashorn, bạn có thể chỉ cần viết: (String) invocable.invokeFunction ("unescape", escapedString); – Shafiul

0

Làn sóng chung StringEscapeUtils không hoạt động đối với tôi.

Bạn có thể chỉ cần sử dụng công cụ javascript nashorn để unescape một chuỗi javascript thoát.

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; 
} 
Các vấn đề liên quan