js使用java变量_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 代码片断:

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 == '/'') {-->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值