Servlet Session(会话)

来源:互联网 发布:淘宝美工要学哪些软件 编辑:程序博客网 时间:2024/06/05 13:31
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将状态保存在服务器端,占用服务器的内存,如果用户量过大,会严重影响服务器的性能



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为4c死屏怎么办 华为4c充电很慢怎么办? 华为4c突然死机了怎么办 华为畅玩4c内存不足怎么办 荣耀4c一直亮屏怎么办 华为手机返回键失灵怎么办 荣耀6p死机了怎么办 荣耀6主板烧坏了怎么办 虚拟运营商倒闭了号怎么办 买到二次放号怎么办 新运动鞋鞋穿着有点紧怎么办 一件代发被买家退货后怎么办? 洗了翻毛的鞋子怎么办 猫眼竹芋泡根了怎么办 双线花叶子卷了怎么办 华为云收藏满了怎么办 小米6云空间满了怎么办 华为云存储已满怎么办 苹果云备份空间不足怎么办 oppor9指纹与密码忘记怎么办 oppo显示密码格式不对怎么办 oppo云服务密码忘了怎么办 小米云内存满了怎么办 id储存空间满了怎么办 苹果手机邮箱服务器连接失败怎么办 苹果查看id闪退怎么办 域名卖出去后涉及赌博怎么办 发票认证后对方作废了怎么办 手机在屋里没信号怎么办 百度云上传文件和谐怎么办 收货地址写错了怎么办 阿里巴巴国际版出现加密令牌怎么办 淘宝寄货到转运仓拒收怎么办 淘宝已发货买家申请退货怎么办 买家给了一个差评不接电话怎么办 卖家单号填错了怎么办 拼多多虚假发货买家怎么办 买家退款后又收到货怎么办 买家确认收货已超时怎么办 淘宝买家不确认收货怎么办 买家快递单号填错怎么办