如何处理会话可能不存在的情况?

时间:2018-01-09 18:19:09

标签: jsp session

我有一个带

的JSP页面
<%@ page session="false" %>

阻止Tomcat自动创建会话,以及类似于

的代码块
1  <%
2  if(request.getSession(false) != null) {
3       session.setAttribute("username", username);
4  }
5  %>

访问该页面会出现“会话无法解析为变量”错误,引用第3行。

如果会话不存在,则request.getSession(false)应返回null,并且应跳过“if”块。相反,Tomcat抱怨该变量不存在于它应该跳过的块中,因为该变量不存在。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

以下是JSP规范对页面指令的session属性的说法:

  

表示该页面需要参与(HTTP)会话。   如果为true,则名为session的类型为javax.servlet.http.HttpSession的隐式脚本语言变量引用该页面的当前/新会话。   如果为false,则页面不参与会话;会话隐式变量不可用,并且在JSP页面主体内对它的任何引用都是非法的,并且会导致致命的转换错误。   默认为true。

因此,您使用session = false,但期望定义会话变量。该规范明确指出,使用session = false会使会话隐式变量[...]不可用

您仍然可以定义一个引用会话的变量:

<%
  HttpSession session = request.getSession(false);
  if (session != null) {
      session.setAttribute("username", username);
  }
%>

也就是说,在JSP中使用scriptlet并从JSP修改会话,都会在应用程序中显示设计问题。 JSP是一个视图组件。这应该在Java代码中完成,在用Java编写的控制器中。 JSP应该只在必要时使用JSP EL,JSTL和其他自定义标记生成HTML。了解MVC。