关于JSP中的隐式Session

本文通过实验展示了在JSP中隐式session与通过request.getSession获取的session并非总是同一对象,阐述了session.invalidate()对该行为的影响及JSTL在session失效后的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在问答频道看到个[url=http://www.iteye.com/problems/95568]问题[/url],比较有趣,摘记如下,以备他时自用。

问题是这样的,下面的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(),要用也放在最后才好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值