实现描述:js前端页面保存到从数据库字段传来经java处理的值后,再从页面传值给java代码再保存到数据库字段;最后保存到数据库字段的值与原数据库查询到的字段值一致?
在jsp程序里js函数中的变量很多时候需要从java变量传值,而java变量中含有js对应的特殊字符对js造成语法性破坏。以下作者就实际处理情况做一总结分析:
一。
JavaScript 中也有一些需要特殊处理的字符,如果直接将它们嵌入 JavaScript 代码中,JavaScript 程序结构将会遭受破坏,甚至被嵌入一些恶意的程序。下面列出了需要转义的特殊 JavaScript 字符:
' :/'
" :/"
/ ://
走纸换页: /f
换行:/n
换栏符:/t
回车:/r
回退符:/b
我们通过一个具体例子演示动态变量是如何对 JavaScript 程序进行破坏的。假设我们有一个 JavaScript 数组变量,其元素值通过一个 Java List 对象提供,下面是完成这一操作的 JSP 代码片断:
textList.add("/";alert();j=/"");%>
<% for ( int i = 0 ; i < textList.size() ; i++)
{ %> txtList[<%=i%>] = "<%=textList.get(i)%>";
① 未对可能包含特殊 JavaScript 字符的变量进行处理
<% } %>
当客户端调用这个 JSP 页面后,将得到以下的 HTML 输出页面:
txtList[0] = "";alert();j="";
① 本来是希望接受一个字符串,结果被植入了一段JavaScript代码
由于包含 JavaScript 特殊字符的 Java 变量直接合并到 JavaScript 代码中,我们本来期望 ① 处所示部分是一个普通的字符串,但结果变成了一段 JavaScript 代码,网页将弹出一个 alert 窗口。想像一下如果粗体部分的字符串是“";while(true)alert();j="”时会产生什么后果呢?
因此,如果网页中的 JavaScript 代码需要通过拼接 Java 变量动态产生时,一般需要对变量的内容进行转义处理,可以通过 Spring 的 JavaScriptUtils 完成这件工作。下面,我们使用 JavaScriptUtils 对以上代码进行改造:
<% for ( int i = 0 ; i < textList.size() ; i++) { %>
① 在输出动态内容前事先进行转义处理
txtList[<%=i%>] = "<%=JavaScriptUtils.
<% } %>
通过转义处理后,这个 JSP 页面输出的结果网页的 JavaScript 代码就不会产生问题了:
txtList[0] = "/";alert();j=/"";
① 粗体部分仅是一个普通的字符串,而非一段 JavaScript 的语句了
其中JavaScriptUtils.javaScriptEscape(String s);函数可参考引自spring 框架web包代码:
/****************************************************/
package org.springframework.web.util;
public class JavaScriptUtils {
/** * Turn special characters into escaped characters conforming to JavaScript. * Handles complete character set defined in HTML 4.01 recommendation. * @param input the input string * @return the escaped string */ public static String javaScriptEscape(String input) { if (input == null) { return input; }
StringBuffer filtered = new StringBuffer(input.length()); char prevChar = '/u0000'; char c; for (int i = 0; i < input.length(); i++) { c = input.charAt(i); if (c == '"') { filtered.append("///""); } else if (c == '/'') {-->