Servlet Session(会话)

来源:互联网 发布:淘宝美工要学哪些软件 编辑:程序博客网 时间:2024/06/11 02:09
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中的<session-config>中设置
 
<session-config>
      <!--单位为分钟-->
    <session-timeout>30</session-timeout>
</session-config>


方法二:在项目的web.xml中定义
<session-config>
      <!--单位为分钟-->
    <session-timeout>30</session-timeout>
</session-config>


方法三:在代码中修改
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将状态保存在服务器端,占用服务器的内存,如果用户量过大,会严重影响服务器的性能



原创粉丝点击