jsp 中 js变量引用java变量时 特殊字符的处理

实现描述:js前端页面保存到从数据库字段传来经java处理的值后,再从页面传值给java代码再保存到数据库字段;最后保存到数据库字段的值与原数据库查询到的字段值一致?

在jsp程序里js函数中的变量很多时候需要从java变量传值,而java变量中含有js对应的特殊字符对js造成语法性破坏。以下作者就实际处理情况做一总结分析:

一。

JavaScript 中也有一些需要特殊处理的字符,如果直接将它们嵌入 JavaScript 代码中,JavaScript 程序结构将会遭受破坏,甚至被嵌入一些恶意的程序。下面列出了需要转义的特殊 JavaScript 字符:

  • ' :/'
  • " :/"
  • / ://
  • 走纸换页: /f
  • 换行:/n
  • 换栏符:/t
  • 回车:/r
  • 回退符:/b

我们通过一个具体例子演示动态变量是如何对 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代码再保存到数据库字段;最好保存到数据库字段的值与原数据库查询到的字段值一致了。


你可能感兴趣的:(jsp 中 js变量引用java变量时 特殊字符的处理)