关于JSP中的隐式Session 博客分类: Coding
程序员文章站
2024-03-20 19:03:28
...
在问答频道看到个问题,比较有趣,摘记如下,以备他时自用。
问题是这样的,下面的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)的结果
贴了大段的代码,说结论吧。
隐式的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代码中问题是这样的,下面的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的确是无效的 - //←抛出空指针异常
贴了大段的代码,说结论吧。
隐式的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(),要用也放在最后才好。