【发布时间】:2010-10-27 06:59:51
【问题描述】:
在我们的网络服务中,我们通过 JavaScript 设置了一个 cookie,我们在 Java (Servlet) 中再次读取它
但是我们需要对 cookie 的值进行转义,因为它可能包含诸如 '&' 之类的非法字符,这会弄乱 cookie。
是否有一种透明的方式来转义(JavaScript)并再次取消转义(Java)?
【问题讨论】:
标签: java javascript cookies escaping
在我们的网络服务中,我们通过 JavaScript 设置了一个 cookie,我们在 Java (Servlet) 中再次读取它
但是我们需要对 cookie 的值进行转义,因为它可能包含诸如 '&' 之类的非法字符,这会弄乱 cookie。
是否有一种透明的方式来转义(JavaScript)并再次取消转义(Java)?
【问题讨论】:
标签: java javascript cookies escaping
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;
}
【讨论】:
在 java 中,您从 Commons Lang 获得了 StringEscapeUtils 以转义/取消转义。
在 Javascript 中,您可以通过 encodeURIComponent 转义,但我认为我提供给您的 Commons 组件将满足您的需求。
【讨论】:
最准确的方法是使用您的 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()});
【讨论】:
客户端 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。
【讨论】: