无法检索servlet中的值集

时间:2012-12-19 22:40:34

标签: javascript jsp session servlets attributes

我相信,这是一个非常简单的问题,但我解决它的所有尝试都失败了。

简而言之:  我有一个JSP文件,其中包含一个调用Java Servlet的表单。  servlet处理输入并返回变量(属性)并重定向回相同的 jsp。  我想让jsp使用 JavaScript 处理返回的属性,而不是使用scriptlet。

JSP代码(test.jsp):

<html>
  ...
  <%@page language="java"
    import="java.sql.*" 
    import="java.util.*"
  %>
  ...
  <body>
    <script type='text/javascript'>
      var name = session.getAttribute("test");
      alert(name);
    </script>
    ...
  </body>
</html>

和Servlet代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
  request.getSession().setAttribute("test", "value");
  String redirectedPage = "/test.jsp";
  RequestDispatcher reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher(redirectedPage);
  reqDispatcher.forward(request,response);
}

我认为问题源于我声明会话变量:

var name = session.getAttribute("test");

我也尝试过:

var name = (String) session.getAttribute("bob");

String name = (String) session.getAttribute("bob");

我可以使用scriptlet(&lt; %%&gt;)在我的表单中访问此属性,但这不允许我修改/处理返回的属性,我需要这样做。

非常感谢任何帮助。如果你觉得这个问题已被提出/解决(我已经搜索过),请原告让我知道。

1 个答案:

答案 0 :(得分:4)

您无法从javascript访问会话,但您当然可以在服务器端创建您的javascript。

<script type='text/javascript'>
  var name = '<%= session.getAttribute("test") %>';
  alert(name);
</script>

如果你没有100%控制实际值(甚至可能那么),那么逃避字符串是一个好主意。否则,有人可能会注入破坏页面的值(最好的情况),或者使某些XSS窃取用户数据或劫持用户会话。

使用Apache commons StringEscapeUtils JavaDoc)看起来像这样

<script type='text/javascript'>
  var name = '<%= StringEscapeUtils.EscapeJavaScript((String)session.getAttribute("test")) %>';
  alert(name);
</script>

如果您要使用它(或者甚至只是一次),我建议创建一个带有属性名称并输出javascript安全字符串的标记。也许作为&lt; MyJsTags:AttributeAsString name =“test”/&gt; 以避免JSP中的脚本允许,如果您想在访问属性时强加新功能,它也会更容易。