在 Java 中取消转义 JavaScript 转义值

Posted

技术标签:

【中文标题】在 Java 中取消转义 JavaScript 转义值【英文标题】:Un-escape JavaScript escaped value in Java 【发布时间】:2010-10-27 06:59:51 【问题描述】:

在我们的网络服务中,我们通过 javascript 设置了一个 cookie,我们在 Java (Servlet) 中再次读取它

但是我们需要对 cookie 的值进行转义,因为它可能包含诸如 '&' 之类的非法字符,这会弄乱 cookie。

是否有一种透明的方式来转义(JavaScript)并再次取消转义(Java)?

【问题讨论】:

【参考方案1】:

Common lang 的 StringEscapeUtils 对我不起作用。

您可以简单地使用 javascript nashorn 引擎对转义的 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;

【讨论】:

【参考方案2】:

在 java 中,您从 Commons Lang 获得了 StringEscapeUtils 以转义/取消转义。

在 Javascript 中,您可以通过 encodeURIComponent 转义,但我认为我提供给您的 Commons 组件将满足您的需求。

【讨论】:

如果你想从 encodeURIComponent 解码,请看这里***.com/questions/607176/…【参考方案3】:

最准确的方法是使用您的 java 代码执行 javascript。希望下面的代码有所帮助。

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());

【讨论】:

使用 nashorn 引擎,你可以简单地写: (String) invocable.invokeFunction("unescape", escapedString);【参考方案4】:

客户端 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());

我会将更多发现添加到my blog entry。

【讨论】:

以上是关于在 Java 中取消转义 JavaScript 转义值的主要内容,如果未能解决你的问题,请参考以下文章

idea还原转义json

字符转码(escape()、encodeURI()、encodeURIComponent()区别详解)

使用 C# 对 JavaScript 的 escape() 进行转义

java 和 JS(javaScript)中的反斜杠正则转义

取消转义字符串中的 unicode

javascript字符串的转换