【问题标题】:JavaScript removes slash from JSP variableJavaScript 从 JSP 变量中删除斜线
【发布时间】:2011-01-16 23:02:27
【问题描述】:

有JSP变量${remoteFolder}

它的值是\\file-srv\demo

使用嵌入在这个 JSP 中的 jQuery。

jQuery 将 ${remoteFolder} 变量解析为 \file-srvdemo ,即一个斜线被删除。

如何保持这个变量的初始值?

已编辑:当${remoteFolder}form 标签内使用时,它解析OK。

edited2:

JSP 的 JS 部分,斜线被去掉了..

  <script>
        var oScript = document.createElement("script");
        oScript.type = "text/javascript";
        oScript.text = "var $j = jQuery.noConflict();";
        oScript.text+= "$j(document).ready(function(){";
        ...
       oScript.text+= "'script':'<%= request.getContextPath()   %>/uploadFile?portletId=${portletId}&remoteFolder=${remoteFolder}',";
        ...
        oScript.text+= "});"; 
        document.body.appendChild(oScript);        
    </script>

edited3:

${remoteFolder} var 的早期用法,用斜杠没问题

【问题讨论】:

  • 奇怪,所以去掉了一个`\`。
  • 是的,'\' 被去掉了

标签: javascript jsp variables escaping slash


【解决方案1】:

尝试将 $remotefolder 设置为 \\\\file-srv\\demo,因为 javascripts 将 \ 解释为转义字符,因此需要 \\ 来打印 \。

【讨论】:

  • 它来自后端,并以 tah 的形式解决了 ok..,但在 jQuery 就绪函数中它去掉了斜线
【解决方案2】:

那是 JavaScript 而不是 jQuery。在使用额外的反斜杠创建 JavaScript 字符串文字时,您需要转义任何想要保留的反斜杠。

【讨论】:

  • inside form tag inside action 属性这个变量包含所有斜线 OK,奇怪..
  • 您能发布您的 JSP 生成的相关 JavaScript 吗?
  • 请参阅“edited2”部分,有一大段代码,其中斜线意外剥离 - 这是“uploadify”插件的 jQuery 部分
  • 对不起,我不清楚。我指的是提供给浏览器的页面的 HTML 源代码的相关 sn-p,而不是 JSP。
  • 您可以使用 base 64,但您需要为此编写/查找解码功能(并非每个浏览器都有内置的 base 64 解码功能)。您只需要使用额外的反斜杠转义 Java 字符串中的每个反斜杠即可。我想问的是,如果您在浏览器中使用“查看源代码”,您会看到什么,以便我们可以确定这是反斜杠转义问题。
【解决方案3】:

这里有两个问题。

首先,\ 是 JS 字符串中的转义字符。当您想在 JS 字符串中表示 \ 时,您需要对其进行双重转义:\\。最简单的方法是为此使用 JSTL fn:replace

var jsVariable = "${fn:replace(javaVariable, '\\', '\\\\')}";

其次,您希望将其作为 URL 参数发送。 \ 是 URL 参数中的非法字符。您需要对其进行 URL 编码。最简单的方法是为此使用 Javascript 的 escape() 函数。

var urlParameter = escape(jsVariable);

总结一下,

oScript.text+= "'script':'<%= request.getContextPath()   %>/uploadFile?portletId=${portletId}&remoteFolder=${remoteFolder}',";

需要替换为

oScript.text += "'script':"
    + "'${pageContext.request.contextPath}/uploadFile"
    + "?portletId=${portletId}"
    + "&remoteFolder=" + escape("${fn:replace(remoteFolder, '\\', '\\\\')}")
    + "',";

或者,您可以只使用/ 而不是\ 作为文件路径分隔符。这在 Windows 中也能完美运行。您不需要转义它们以在字符串中使用,但是您仍然需要对其进行 URL 编码。

oScript.text += "'script':"
    + "'${pageContext.request.contextPath}/uploadFile"
    + "?portletId=${portletId}"
    + "&remoteFolder=" + escape("${remoteFolder}")
    + "',";

【讨论】:

  • 问题是仅仅替换反斜杠是不够的。如果字符串中有双引号字符怎么办?还是两字节的 Unicode 字符?好吧,在这种情况下,它是一个文件名,所以也许可以安全地做出一两个假设。
  • BalusC,感谢您的澄清。我会尝试这种方式。最初我尝试转义,但是 /\f 给我的符号看起来像正方形,当我在记事本中检查这个字符串时。
【解决方案4】:

我发现如果没有我自己的 EL 函数库和一些关键函数,我就无法编写一个严肃的 Web 应用程序。其中有一个“jsQuote”(或“escapeJS”,取决于我的心情)函数,其目的是“保护”扩展字符串,以便可以将它们放入 Javascript 字符串常量中。它类似于fn:escapeXml(),但它不是针对 HTML 语法,而是针对 Javascript。通常它要做的是检查反斜杠、引号字符、换行符和其他常用控制字符,然后是 7 位可打印范围之外的任何字符。有了这样的功能,你总是可以安全地做这样的事情:

<script>
  // ...
  var s = 'A string ${yourLib:escapeJS(some.java.bean.property)} constant';
  // ...
</script>

我真的希望这样的东西能成为 JSTL 标准的一部分,但我不抱希望。幸运的是,它真的很容易编写。

【讨论】:

  • 实际上是个好主意,考虑到这种情况经常发生在 Web 开发人员身上
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2014-07-23
  • 2010-12-29
相关资源
最近更新 更多