经过数小时的搜寻和搜寻,我终于来到了我要问你的地方! :)

情况如下:
Web服务在CDATA中传递数据。解析这些数据并将其放入我们的模型中。使用Spring MVC,我们访问JSP文件中的模型以创建...。这就是重点... JSON!历史上不要问! ;-)

现在,不知何故有人想到了一个光荣的主意,将多个(反)斜线放入title属性中。 getTitle()方法返回字符串“ /// Glasvegas \\”。如果我们在JSON(在JSP中创建)上执行JavaSCript eval()以获取JavaScript Json对象,那么这当然是行不通的。它只是将反斜杠解释为注释,从而使Json无效。
我尝试使用apache.common和springframework中的escapeHtml()方法,但是当正确编码所有其他特殊字符时,它们都只是忽略了反斜杠。

然后,我尝试编写自己的方法:

public static String escapeHTML(String string) {
    String foreslash="\";
    String regex="\\\\";
    System.out.println(string.replaceAll(regex,foreslash));
    string.replaceAll(regex,foreslash);
    return string;
}


在控制台输出中,该字符串已正确替换,但是如果在返回时中断并检查调试器中的变量“ string”,则其仍为“ /// Glasvegas \\”。在生成的JSP中也相同。

所以,我在这里迷路了。

问候,
均价

最佳答案

字符串是不可变的。方法“ replaceAll”的名称听起来好像您实际上是在修改字符串对象本身,但实际上不是。该方法仅返回操作结果。这就是为什么您从System.out.println获得正确的输出的原因。但是然后您就产生了一个错误的想法,认为仅仅因为调用是独立存在的,而不是在System.out.println内部,所以Java代码应该自己理解,这次您希望更改在字符串对象中是永久的;)

尝试像这样重写方法的结尾:

System.out.println(string.replaceAll(regex,foreslash));
return string.replaceAll(regex,foreslash);


同样,冠名“ foreslash”使它听起来好像92是正斜杠的代码。也许是,我不知道。您的正则表达式会查找反斜杠。这有点令人困惑!

10-07 14:12
查看更多