服务器可以为每个用户浏览器创建一个session对象,一个浏览器独占一个session对象,需要保存用户数据时服务器程序可将用户数据写到用户浏览器独占的session中. 当浏览器访问其他程序时(指的是当前应用下的其他程序),其他程序可从用户的session取出数据
访问淘宝给个session,访问京东是不能用这个session的
1. cookie是在客户端浏览器中,只能存字符串;数据不安全.文件打开就能看了, 而session是在服务器中存,可以存对象
session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象
2. session是同一会话内有效,应用内几个servlet都可以共享数据
3.session也是一个域对象,目前为止共有三个域对象:request,servletcontext,session
作用域大于request(一次请求之内有效,转发后还有) 小于servletcontext(多个用户都能访问当前应用的servletcontext)
4.session自动产生的id属性,存储到cookie里面,带回浏览器!服务器就根据这个id区分谁是谁的session(可见,session依赖于cookie)
(但是session依然是存储在服务器中,只是id给塞进cookie带回给浏览器了)
购物车案例:
servlet1.首页面显示商品列表
servlet2.添加商品到购物车的逻辑处理
servlet3.查看购物车的逻辑处理
购物车显示两行金瓶梅的解决方法: 不用list,改map; 或者book里添加字段count计数
session对象API:
setMaxInactiveInterval(int interval) 设置session存活时间,单位是秒,默认30分钟(应该是保持键鼠不动开始计时?)
invalidate();登陆网站时有退出按钮,点击后直接调用,直接干掉session,其他应用看到没有这个session,就让你重新登陆
getSession():
1.获取名称为JsessionID的cookie
2.没有这样的cookie,则创建新HttpSession对象,分配唯一sessionID,并向客户端写一个名为JSESSIONID=SessionID的cookie
3.有这样的cookie,则获取cookie值(即HttpSession对象的值),在服务器内存根据ID找到那个HttpSession对象
4.找到了,取出session对象开始服务
5.找不到,从2开始
session状态:第一次访问服务器动态资源就创建request.getSession();
销毁:1.超时(离开电脑开始计时)2.Session.invlidate()强制销毁
后续什么跟序列化啥的有关,服务器stop(而不是断电)的时候把session序列化(搁置)(服务器重启或内存溢出而触发);把内存的热乎乎的东西写到了硬盘上.重启服务器后硬盘文件消失,重新回到session(内存)上,(激活)
客户端禁用Cookie后的会话数据保存问题:
解决方案:URL重写,必须对所有的地址都重写 (略)