Servlet Session(会话)
1、什么是Session(会话)
浏览器访问Web服务器时,服务器会为每一个浏览器在服务器端的内存中分配空间,单独创建一个Session对象,该对象有一个Id属性,其值唯一,一般称之为SessionId,并且服务器会将这个SessionId(使用Cookie的方式)发送给浏览器;浏览器再次访问服务器时,会将SessionId发送给服务器,服务器可以依据SessionId找到对应的Session对象。
2、如何获得Session
HttpSession session = req.getSession(flag);//等价于HttpSession session = req.getSession();
HttpSession是个接口,返回的是符合接口规范的实现类对象
当flag为true时:先查看请求中有没有SessionId,如果没有SessionId,服务器创建一个Session对象;如果有SessionId,依据SessionId查找对应Session对象,找到则返回,找不到则创建一个新的Session对象,所以flag为true时,一定能得到一个Session对象
当flag为false时,没有SessionId或者有SessionId但是没有找到Session对象,均返回null。
两种获取方式一般使用场景:
当向Session中存储登录信息时,建议:HttpSession session =request.getSession();
当从Session中获取登录信息时,建议:HttpSession session =request.getSession(false);并做非空判断。
3、如何使用Session绑定对象
//绑定对象
void setAttribute(String name , Object obj ) ;
//获取绑定对象
Object Session.getAttribute( String name);//返回Object,使用时,根据绑定类型向下转型
//移除绑定对象
void Session.removeAttribute( String name ) ;
4、如何删除Sesssion对象
session.invalidate()方法是将session设置为失效,一般在退出登陆时使用。
注意:如果你的session已经失效了,当你调用它的getAttribute方法时候会抛出NullPointerException异常。
5、Session超时
Web服务器会将空闲时间过长的Session对象删除掉,以节省服务器内存空间资源
程序中session都有一个默认的过期时间,其中tomcat中的默认时间为30分钟
5.1 设置Sessiond的超时时间
以下是设置session的过期时间的三个方法:
方法一:在tomcat—>conf—>conf/web.xm中的
方法二:在项目的web.xml中定义
方法三:在代码中修改
session.setMaxInactiveInterval(30*60);//单位为秒,设置为-1则永不过期
注:
方法一和方法二的配置方式是针对所有Session的设置。
方法三是针对特定的Session设置。
三种超时设置的优先级为 方法三 > 方法二 > 方法一。
6、浏览器禁用Cookie的后果
如果浏览器禁用Cookie,Session不能使用。
服务器在默认情况下,会使用Cookie的方式将SessionId发送给浏览器,如果用户禁止Cookie,则SessionId不会被浏览器保存。那么,服务器可以使用如URL重写(将SessionId保存到请求路径上),这样的方式来告诉浏览器发送SessionId。
7、URL重写
如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把SessionId附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,SessionId被自动作为请求行的一部分而不是作为请求头发送回服务器。这种方法称为URL重写(URL rewriting)。
一般来说,URL重写是支持Session的非常健壮的方法。在不能确定浏览器是否支持Cookie的情况下应该使用这种方法。
使用URL重写应该注意下面几点:
如果使用URL重写,应该在应用程序的所有页面中,对所有的URL编码,包括所有的超链接和表单的action属性值。
应用程序的所有的页面都应该是动态的。因为不同的用户具有不同的会话ID,因此在静态HTML页面中无法在URL上附加会话ID。
所有静态的HTML页面必须通过Servlet运行,在它将页面发送给客户时会重写URL。
7.1 如何实现URL重写?
如果是链接地址和表单提交,使用 response.encodeURL(String url) 生成重写后的URL。
如果是重定向,使用response.encodeRedirectURL(String url ) ;生成重写后的URL
注意:在使用URL重写的方法之前,需要确保Session会话已经存在。一般在以上两个方法之前事先使用 request.getSession();来保证Session已经创建。
注意:只有当浏览器的 Cookie被禁用的时候,重写后的URL才会加上 SessionId。否则重写后的URL将返回原来的URL。
8、Session的优缺点
优点:
安全(将状态保存在服务器端)
Session能够保存的的数据类型更丰富,Cookie只能保存字符串
Session能够保存更多的数据,Cookie大约保存4k
缺点:
Session将状态保存在服务器端,占用服务器的内存,如果用户量过大,会严重影响服务器的性能
还没有评论,来说两句吧...