如何在 JSP 上转义撇号或引号(由 JavaScript 使用)

IT技术 java javascript forms jsp escaping
2021-01-13 10:46:42

我有一个用户表单。如果用户输入一个字符串'"作为它的一部分,我没有问题。表单已提交并正确保存到数据库中。我的问题是当我重新加载页面时(所有条目都可以修改并在显示之前加载到 JSP 中的列表中)。在加载页面时,我收到一条错误消息:

missing ) after argument list 'Caroline's message', \n

我需要做什么来转义这个字符串以在前端显示它?

这是我在前端用于读取数据并将其存储在 JavaScript 对象中的代码。我不完全确定我需要逃到哪里。导致问题的字段是 c.getComName:

communications[<%=i%>][1] = new CommObject('<%=c.getComId()%>', '<%=c.getComName()%>');

使用生成的 HTML 更新:

communications[0][1] = new CommObject('101', 'Caroline's Message');
6个回答

我更喜欢避免在我的页面中间使用 scriptlet,并且在 JavaScript 代码中使用时不得不使用它们(越来越频繁)来转义字符串。我想要一种转义字符串表达式语言(EL) 方式。我创建了一个非常小的自定义标签库,我仅用于此目的:

实用程序.java:

package com.mycom.taglibs;

import org.apache.commons.lang.StringEscapeUtils;

public class Utilities {
    public static String escapeJS(String value) {
        return StringEscapeUtils.escapeJavaScript(value);
    }
}

mytaglib.tld:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">

  <description>My Tag Library</description>
  <display-name>Tag Utils</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>myt</short-name>

  <function>
    <description>
        JavaScript Escape function
    </description>
    <name>escapeJS</name>
    <function-class>com.mycom.taglibs.Utilities</function-class>
    <function-signature>java.lang.String escapeJS(java.lang.String)</function-signature>
  </function>
</taglib>

并且,在 JSP 页面中:

<%@ taglib prefix="myt" uri="/WEB-INF/mytaglib.tld" %>
The escaped string is: ${myt:escapeJS(variableHoldingTheString)}
谢谢,这是个好建议 :) 我只想补充一点,您不需要 Utilities.java 类。你可以像这样直接用 StringEscapeUtils 构造标签库: <function-class>org.apache.commons.lang.StringEscapeUtils</function-class> <function-signature>java.lang.String escapeJavaScript(java.lang.String)< /功能签名>
2021-03-17 10:46:42
用新的包和函数名更新@machinery 的答案:<function-class>org.apache.commons.lang3.StringEscapeUtils</function-class> <function-signature>java.lang.String escapeEcmaScript(java.lang.String)</function-signature> 但是,我没有使用这个答案,因为我的 taglib 标签抱怨 The content of element type "taglib" must match "(tlibversion,jspversion?,shortname,uri?,info?,tag+)"并且我不知道如何修复它。
2021-03-26 10:46:42

使用 Apache StringEscapeUtils.escapeJavaScript函数。

Escapes the characters in a String using JavaScript String rules.

Escapes any values it finds into their JavaScript String form.
Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.)

So a tab becomes the characters '\\' and 't'.
请注意,这已更改为StringEscapeUtils.escapeEcmaScript(String)in commons lang 3.x+
2021-03-13 10:46:42
另一个注意事项,在较新版本的 commons-lang3 中,这被标记为已弃用,以支持来自 commons-text 的等效类。
2021-04-02 10:46:42
此外,如果此字符串是一个 URL(例如 javascript:launchURL(<%=c.getComUrl()%>),您可以将此 StringEscapeUtils.escapeJavaScript 与 URLEncoder.encode 结合起来生成一个 javascript 安全的 URL。
2021-04-04 10:46:42
它还将任何非拉丁字母符号转换为其 unicode 序列(“кириллица”->“\\u043A\\u0438\\u0440\\u0438\\u043B\\u043B\\u0438\\u0446\\u0430”)。问题只是关于单引号。
2021-04-10 10:46:42

fn:escapeXml在 JavaScript 中不起作用。它取代'#&0039;被执行的JavaScript时仍然导致错误。

只有以 JavaScript 方式转义才是正确的: \'

Apache StringEscapeUtils.escapeJavaScript 函数会为您执行此操作。为它创建一个标签库大大简化了事情。

我们也有来自 Spring 的非常好的解决方案:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<spring:message code="${propertyName}" javaScriptEscape="true"/>

所以,这篇文章的问题可以通过这种方式解决:

communications[<%=i%>][1] = new CommObject('<spring:message code="${c.comId}" javaScriptEscape="true"/>', '<spring:message code="${c.comName}" javaScriptEscape="true"/> <%=c.getComName()%>');

我认为此答案仅在propertyName指向 MessageResource 中的消息时才有效为了打印 propertyName 的实际文本,转义,你想要text="${propertyName}"不过,非常方便的标签!我会经常使用它。
2021-04-05 10:46:42

您可以使用 JSTL 转义函数fn:escapeXml()来摆脱由于单引号 (`) 引起的异常。以下示例演示了差异。

例如:

<c:set var="string1" value="This is abc's first String."/>
<c:set var="string2" value="This is abc's second String."/>

<p>With escapeXml() Function:</p>
<p>string (1): ${fn:escapeXml(string1)}</p>

<p>Without escapeXml() Function:</p>
<p>string (2): ${fn:escapeXml(string2)}</p>

结果

string (1):这是 abc 的第一个 String。

字符串 (2):这是 abc 的第二个字符串。