在问答频道看到个[url=http://www.iteye.com/problems/95568]问题[/url],比较有趣,摘记如下,以备他时自用。
问题是这样的,下面的JSP代码中问题是这样的,下面的JSP代码中
因为在Java程序中说起session,都是指request.getSession得到的,所以它们应该是指向同一个实例。而上面代码中隐式的session和request.getSession动作却是不同!
正好手边有环境,于是大致试了试。以下是我的尝试JSP代码
注1:user是session里放的变量,每当session被创建时会自动放个new User在里面。
注2:先尝试request.getSession(true),再次尝试request.getSession(false)
SessionListener中创建新User的代码
■request.getSession(true)的结果
■request.getSession(false)的结果
贴了大段的代码,说结论吧。
[color=darkblue][b]隐式的session和request.getSeesion并不总是一个对象![/b][/color]
1. 画面初始时,session(即隐式的session)和request.getSession指向相同对象。
2. 调用session.invalidate()时,
1.request的session被设置成null。
2.[color=darkred][b]session没有变成null,可以取id,但不能再访问attribute。[/b][/color]
3.session.invalidate后,JSTL无法定位对象。
看来还是不要在JSP中调用session.invalidate(),要用也放在最后才好。
问题是这样的,下面的JSP代码中问题是这样的,下面的JSP代码中
<%
1.session.invalidate();
2.out.print("id1:"+session.getId()+"<br/>");
3.out.print("id2:"+request.getSession(false).getId());
%>
因为在Java程序中说起session,都是指request.getSession得到的,所以它们应该是指向同一个实例。而上面代码中隐式的session和request.getSession动作却是不同!
正好手边有环境,于是大致试了试。以下是我的尝试JSP代码
- <%=session.getId()%> - <%=request.getSession().getId()%><br/>//←比较sessionID
${user}<br/> //注1
- <%=session.getAttribute("user")%><br />
- <%=request.getSession(false).getAttribute("user")%><br/>//←比较三者中的User对象
<%
session.invalidate();
out.print(session + "<br />");
out.print(request.getSession(true) + "<br />"); //注2
out.print(session + "<br />"); //←打印invalidate后内存地址。
%>
- <%=session.getId() %> - <%=request.getSession(false).getId()%><br />
${user}<br />
- <%=session.getAttribute("user") %><br />
- <%=request.getSession(false).getAttribute("user") %><br />
注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的确是无效的
- //←抛出空指针异常
贴了大段的代码,说结论吧。
[color=darkblue][b]隐式的session和request.getSeesion并不总是一个对象![/b][/color]
1. 画面初始时,session(即隐式的session)和request.getSession指向相同对象。
2. 调用session.invalidate()时,
1.request的session被设置成null。
2.[color=darkred][b]session没有变成null,可以取id,但不能再访问attribute。[/b][/color]
3.session.invalidate后,JSTL无法定位对象。
看来还是不要在JSP中调用session.invalidate(),要用也放在最后才好。