1

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

简而言之:我有一个带有调用 Java Servlet 的表单的 JSP 文件。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 (<% %>) 从我的表单中访问此属性,但这不允许我修改/处理返回的属性,我需要这样做。

任何帮助是极大的赞赏。如果你觉得这个问题已经被问到/解决了(我已经搜索过),请礼貌地告诉我。

4

1 回答 1

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 安全字符串。也许作为<MyJsTags:AttributeAsString name="test"/>来避免脚本让您的 JSP 进入,如果您想在访问属性时强加新功能,它也会更容易。

于 2012-12-19T22:44:32.073 回答