我相信,这是一个非常简单的问题,但我解决它的所有尝试都失败了。
简而言之: 我有一个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;)在我的表单中访问此属性,但这不允许我修改/处理返回的属性,我需要这样做。
非常感谢任何帮助。如果你觉得这个问题已被提出/解决(我已经搜索过),请原告让我知道。
答案 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中的脚本允许,如果您想在访问属性时强加新功能,它也会更容易。