在 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 转义值的主要内容,如果未能解决你的问题,请参考以下文章
字符转码(escape()、encodeURI()、encodeURIComponent()区别详解)
使用 C# 对 JavaScript 的 escape() 进行转义