实现描述:js前端页面保存到从数据库字段传来经java处理的值后,再从页面传值给java代码再保存到数据库字段;最后保存到数据库字段的值与原数据库查询到的字段值一致?
在jsp程序里js函数中的变量很多时候需要从java变量传值,而java变量中含有js对应的特殊字符对js造成语法性破坏。以下作者就实际处理情况做一总结分析:
一。
JavaScript 中也有一些需要特殊处理的字符,如果直接将它们嵌入 JavaScript 代码中,JavaScript 程序结构将会遭受破坏,甚至被嵌入一些恶意的程序。下面列出了需要转义的特殊 JavaScript 字符:
我们通过一个具体例子演示动态变量是如何对 JavaScript 程序进行破坏的。假设我们有一个 JavaScript 数组变量,其元素值通过一个 Java List 对象提供,下面是完成这一操作的 JSP 代码片断:
jsTest.jsp:未对 JavaScript 特殊字符进行处理
<%@ page language="java" contentType="text/html; charset=utf-8"%> <% List textList = new ArrayList(); textList.add("/";alert();j=/"");%> |
当客户端调用这个 JSP 页面后,将得到以下的 HTML 输出页面:
由于包含 JavaScript 特殊字符的 Java 变量直接合并到 JavaScript 代码中,我们本来期望 ① 处所示部分是一个普通的字符串,但结果变成了一段 JavaScript 代码,网页将弹出一个 alert 窗口。想像一下如果粗体部分的字符串是“";while(true)alert();j="”时会产生什么后果呢?
因此,如果网页中的 JavaScript 代码需要通过拼接 Java 变量动态产生时,一般需要对变量的内容进行转义处理,可以通过 Spring 的 JavaScriptUtils 完成这件工作。下面,我们使用 JavaScriptUtils 对以上代码进行改造:
<%@ page language="java" contentType="text/html; charset=utf-8"%> <% List textList = new ArrayList(); textList.add("/";alert();j=/"");%> |
通过转义处理后,这个 JSP 页面输出的结果网页的 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 == '/'') {
filtered.append("//'");
}
else if (c == '//') {
filtered.append("////");
}
else if (c == '/') {
filtered.append("///");
}
else if (c == '/t') {
filtered.append("//t");
}
else if (c == '/n') {
if (prevChar != '/r') {
filtered.append("//n");
}
}
else if (c == '/r') {
filtered.append("//n");
}
else if (c == '/f') {
filtered.append("//f");
}
else {
filtered.append(c);
}
prevChar = c;
}
return filtered.toString();
}
}
/****************************************************/
二。对于js字符串含有【',"】单引号,双引号的情况,且从java变量传过来。则可对java字符串的单双引号进行转换-——》用‘"’代替双引号用‘'’代替单引号,。
引出:
xhtml提供了一组特殊的字符
1,这些字符有时候会出现在文档中,但不能以本身的样式进行拼写。
2,在某些情况下,这些字符在xhtml中具有特殊的意义,比如>、<和& 。
3,其他一些情况是某些字符在键盘上没有对应的按钮,比如表示摄氏温度的小圆圈。
4,此外,还包括一些非换行空格,浏览器识别为硬空格,浏览器不能像处理其他的多个空格那样,排除一部分空格。
这些特殊的字符称为实体,这是浏览器对它们的命名。文档中的实体可以在浏览器中通过对应的字符来替换。
下面列出了一些常用的字符实体:
字符 实体 含义
& & and的记号
< < 小于号
> > 大于号
" " 双引号
' '或' 单引号
1/4 ¼ 四分之一
1/2 ½ 二分之一
3/4 ¾ 四分之三
。 ° 摄氏度
(space) 非换行空格
比如在onmouseover属性中调用js函数,可能会出现英文双/单引号“和'3层嵌套的情况,浏览器会发现语法错误,因此在函数参数中的”或'需用其实体替代了(好像还有其他办法,这么做是最简单的)。
在IE下,'不能替代',只能用',“用"替代是没问题的;在firefox下,'和'都能被正确地解释为单引号'。
结合以上一二的实例:
function saveDate(){
<%
String buffer = "??????"; //其中?内容来至数据库某字段值含有单双引号,其含有?值为【"t'tt'ttt"ttt"1、定义:实际及时完成项数与计划完成总项数的比率 2、计算公式:工作计划完成率=实际及时完成项数/计划完成总项数×100%"
】
buffer = JavaScriptUtils.javaScriptEscape(buffer);
//buffer = Tools.replaceAll(buffer,"///"",""");
buffer = Tools.replaceAll(buffer,"//'","';"); //单引号用 ' 代替
out.println("alldata["+seq+"]["+coll+"]=/""+buffer+"/";");
%>
}
//经过处理后,js前端保存到从数据库字段传来经java处理的值后,再从页面传值给java代码再保存到数据库字段;最好保存到数据库字段的值与原数据库查询到的字段值一致了。