关于JSP中的隐式Session

阅读更多
在问答频道看到个 问题,比较有趣,摘记如下,以备他时自用。

问题是这样的,下面的JSP代码中问题是这样的,下面的JSP代码中
<%
1.session.invalidate();
2.out.print("id1:"+session.getId()+"
"); 3.out.print("id2:"+request.getSession(false).getId()); %>


因为在Java程序中说起session,都是指request.getSession得到的,所以它们应该是指向同一个实例。而上面代码中隐式的session和request.getSession动作却是不同!

正好手边有环境,于是大致试了试。以下是我的尝试JSP代码
- <%=session.getId()%> - <%=request.getSession().getId()%>
//←比较sessionID ${user}
//注1 - <%=session.getAttribute("user")%>
- <%=request.getSession(false).getAttribute("user")%>
//←比较三者中的User对象 <% session.invalidate(); out.print(session + "
"); out.print(request.getSession(true) + "
"); //注2 out.print(session + "
"); //←打印invalidate后内存地址。 %> - <%=session.getId() %> - <%=request.getSession(false).getId()%>
${user}
- <%=session.getAttribute("user") %>
- <%=request.getSession(false).getAttribute("user") %>

注1:user是session里放的变量,每当session被创建时会自动放个new User在里面。
注2:先尝试request.getSession(true),再次尝试request.getSession(false)

SessionListener中创建新User的代码
	@Override
	public void sessionCreated(HttpSessionEvent event) {
		event.getSession().setAttribute(KEY_USER, new User());
	}


■request.getSession(true)的结果
- 7B380F9A6ED68EB2905F82509A9931FC - 7B380F9A6ED68EB2905F82509A9931FC //←两个sessionID相同
cn.clxy.ssm.common.data.User@37a744
- cn.clxy.ssm.common.data.User@37a744
- cn.clxy.ssm.common.data.User@37a744 //←三个User都相同
org.apache.catalina.session.StandardSessionFacade@1c69f05
org.apache.catalina.session.StandardSessionFacade@f20853 //←request里的session被重新创建
org.apache.catalina.session.StandardSessionFacade@1c69f05 //←但页面中隐式的session没有变化
- 7B380F9A6ED68EB2905F82509A9931FC - 99A9276B064581ED4A6DFE3CD51C9290 //←两个sessionID已经不同了
{blank} //←JSTL已经无法找到User实例
- //←抛出“session已经无效”的异常。说明页面中隐式session的确是无效的
- cn.clxy.ssm.common.data.User@b7ff //←虽然JSTL找不到User,但request中的session里面是有新User的



■request.getSession(false)的结果
- 99A9276B064581ED4A6DFE3CD51C9290 - 99A9276B064581ED4A6DFE3CD51C9290
cn.clxy.ssm.common.data.User@b7ff
- cn.clxy.ssm.common.data.User@b7ff
- cn.clxy.ssm.common.data.User@b7ff
org.apache.catalina.session.StandardSessionFacade@f20853
null //←request的session无效后为null
org.apache.catalina.session.StandardSessionFacade@f20853
- 99A9276B064581ED4A6DFE3CD51C9290 - //←抛出空指针异常
{blank} //←JSTL已经无法找到User实例
-  //←抛出“session已经无效”的异常。说明页面中隐式session的确是无效的
- //←抛出空指针异常


贴了大段的代码,说结论吧。
隐式的session和request.getSeesion并不总是一个对象! 
1. 画面初始时,session(即隐式的session)和request.getSession指向相同对象。
2. 调用session.invalidate()时,
  1.request的session被设置成null。
  2. session没有变成null,可以取id,但不能再访问attribute。
3.session.invalidate后,JSTL无法定位对象。

看来还是不要在JSP中调用session.invalidate(),要用也放在最后才好。

你可能感兴趣的:(关于JSP中的隐式Session)