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"%>
<jsp:directive.page import="java.util.*"/>
<%  List textList = new ArrayList();  
textList.add("/";alert();j=/"");%>
<script>  var txtList = new Array();   
<% for ( int i = 0 ; i < textList.size() ; i++) 
{ %>     txtList[<%=i%>] = "<%=textList.get(i)%>"; 	
 ① 未对可能包含特殊 JavaScript 字符的变量进行处理  
 <% } %></script>

当客户端调用这个 JSP 页面后,将得到以下的 HTML 输出页面:

<script>  var txtList = new Array();   
txtList[0] = "";alert();j=""; 
① 本来是希望接受一个字符串,结果被植入了一段JavaScript代码
</script>

由于包含 JavaScript 特殊字符的 Java 变量直接合并到 JavaScript 代码中,我们本来期望 ① 处所示部分是一个普通的字符串,但结果变成了一段 JavaScript 代码,网页将弹出一个 alert 窗口。想像一下如果粗体部分的字符串是“";while(true)alert();j="”时会产生什么后果呢?

因此,如果网页中的 JavaScript 代码需要通过拼接 Java 变量动态产生时,一般需要对变量的内容进行转义处理,可以通过 Spring 的 JavaScriptUtils 完成这件工作。下面,我们使用 JavaScriptUtils 对以上代码进行改造:

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<jsp:directive.page import="java.util.*"/>
<jsp:directive.page import="org.springframework.web.util.JavaScriptUtils"/>
<%  List textList = new ArrayList();  textList.add("/";alert();j=/"");%>
<script>   var txtList = new Array();   
<% for ( int i = 0 ; i < textList.size() ; i++) { %> 
  ① 在输出动态内容前事先进行转义处理   
txtList[<%=i%>] = "<%=JavaScriptUtils.javaScriptEscape(""+textList.get(i))%>";   
<% } %>
</script>

通过转义处理后,这个 JSP 页面输出的结果网页的 JavaScript 代码就不会产生问题了:

<script>   var txtList = new Array();  
 txtList[0] = "/";alert();j=/""; 
 ① 粗体部分仅是一个普通的字符串,而非一段 JavaScript 的语句了
</script>

 其中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字符串的单双引号进行转换-——》用‘&quot;’代替双引号用‘&#39;’代替单引号,。

引出:

xhtml提供了一组特殊的字符
1,这些字符有时候会出现在文档中,但不能以本身的样式进行拼写。
2,在某些情况下,这些字符在xhtml中具有特殊的意义,比如>、<和& 。
3,其他一些情况是某些字符在键盘上没有对应的按钮,比如表示摄氏温度的小圆圈。
4,此外,还包括一些非换行空格,浏览器识别为硬空格,浏览器不能像处理其他的多个空格那样,排除一部分空格。
这些特殊的字符称为实体,这是浏览器对它们的命名。文档中的实体可以在浏览器中通过对应的字符来替换。

下面列出了一些常用的字符实体:
字符          实体                      含义
&             &amp;                   and的记号
<             &lt;                       小于号
>             &gt;                      大于号
"              &quot;                   双引号
'               &apos;或&#39;       单引号
1/4           &frac14;                 四分之一
1/2           &frac12;                 二分之一
3/4           &frac34;                 四分之三
。             &deg;                    摄氏度
(space)      &nbsp;                  非换行空格

比如在onmouseover属性中调用js函数,可能会出现英文双/单引号“和'3层嵌套的情况,浏览器会发现语法错误,因此在函数参数中的”或'需用其实体替代了(好像还有其他办法,这么做是最简单的)。

在IE下,&apos;不能替代',只能用&#39;,“用&quot;替代是没问题的;在firefox下,&apos;和&#39;都能被正确地解释为单引号'。

结合以上一二的实例:

function saveDate(){

<%

          String buffer = "??????"; //其中?内容来至数据库某字段值含有单双引号,其含有?值为【"t'tt'ttt"ttt"1、定义:实际及时完成项数与计划完成总项数的比率  2、计算公式:工作计划完成率=实际及时完成项数/计划完成总项数×100%"

          buffer = JavaScriptUtils.javaScriptEscape(buffer);
           
           //buffer = Tools.replaceAll(buffer,"///"","&quot;");
           buffer = Tools.replaceAll(buffer,"
//'","&#39;");  //单引号用 &#39 代替
           out.println("alldata["+seq+"]["+coll+"]=/""+buffer+"/";");

%>

} 

//经过处理后,js前端保存到从数据库字段传来经java处理的值后,再从页面传值给java代码再保存到数据库字段;最好保存到数据库字段的值与原数据库查询到的字段值一致了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值