Javascript - session.getAttribute返回未定义的值

时间:2012-02-08 11:58:40

标签: javascript html forms

我有一个JSP表单,它从用户读取输入并调用要处理的Java servlet 数据。数据一旦被处理,就会调用session.setAttribute来存储重要信息。然后在Javascript中我尝试读取会话变量并显示 它在屏幕上。代码看起来像这样(删除了一些代码):

<script type="text/javascript">
   var test = <%= session.getAttribute( "mySessionVar" ) %>;
   document.write (test);
}

当用户在表单中输入一个整数时,一切都按预期工作并输出 正确显示在屏幕上。但是,当用户在表单中输入String时, 屏幕上显示“undefined”

知道我做错了什么吗?

2 个答案:

答案 0 :(得分:4)

考虑您的代码的作用。实际上,不要考虑它,看看它。在浏览器中显示页面的源代码时,打开它。假设session属性包含值hello,那么您的代码将生成

<script type="text/javascript">
   var test = hello;
   document.write (test);
</script>

因此该值将被解释为JavaScript变量。而且由于您很可能没有定义名为hello的变量,因此会产生undefined

但是,如果您现在只添加引号:

var test = "<%= session.getAttribute( "mySessionVar" ) %>";

然后你仍然不安全,因为正如你所说的那样,价值来自你的用户,它不仅可以包含引号本身,还可以包含更多JavaScript代码甚至HTML代码。

想象一下,您的用户输入"; while(1) {alert('This site is crap!')};</script><h1>This site is crap!</h1>(在开始时注意引号字符!)

导致您的源代码包含:

<script type="text/javascript">
    var test = ""; while(1) {alert('This site is crap!')};</script><h1>This site is crap!</h1>

现在您的网站不仅会显示“此网站是废话!”用大写字母,但会将用户锁定在无限循环的警报框中。 (称为Cross-Site Scripting

Web开发中的头号规则,永远不会输出尚未正确转义的任何内容(尤其不是用户输入)。使用StringEscapeUtils.escapeJavaScript表示JavaScript,c:out表示HTML。

另见例如:

PS:我希望,如果您正在使用数据库,那么您正在正确地转义SQL语句,否则人们可以非常简单地访问您的数据库和服务器(称为SQL injection

答案 1 :(得分:1)

试试这个

var test = '<%= session.getAttribute( "mySessionVar" ) %>';