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

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

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

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

【问题讨论】:

    标签: java javascript cookies escaping


    【解决方案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 组件将满足您的需求。

      【讨论】:

      【解决方案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

      【讨论】:

        猜你喜欢
        • 2015-05-16
        • 2015-05-31
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        相关资源
        最近更新 更多