会话技术
1. 会话:一次会话中包含多次请求和响应。
* 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能:在一次会话的范围内的多次请求间,共享数据
3. 方式:
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
4. http协议是无状态协议,服务器无法区分请求是不同用户发起的还是同一用户发起的多次请求。
Cookie
1. Cookie是客户端技术,服务器产生的cookie通过set-Cookie响应头发送回浏览器,
2. 浏览器再次访问该服务器时,会带上该cookie信息,这样就可以解保存用户自身数据。
3. 基于响应头set-cookie和请求头cookie实现
使用
//创建cookie对象,绑定数据
Cookie cookie = new Cookie("name","zhangsan");
//将cookie发送回浏览器端
response.addCookie(cookie);
//获取浏览器的cookie
Cookie[] cookie = request.getCookies();
cookie.getName();cookie.getValue();
//设置了path之后,则访问相应的路径下的资源才会带上cookie
cookie.setPath("/应用名/资源名");
//也就是设置cookie的域名,(localhost)设置除本身域名之外的cookie,chrome浏览器会阻止。
cookie.setDomain("域名");
cookie的存活时间
1.默认情况
Cookie默认情况下,当你关闭浏览器,则保存的cookie失效。
默认是保存在浏览器的内存中,浏览器关闭,则cookie消失。
2.持久化存储
cookie.setMaxAge(int time);time是秒//设置cookie的存活时间,将cookie数据写入硬盘中
time为正数:表示cookie的存活时间
time为负数:默认值
time为0:删除cookie信息//删除cookie的时候,cookie的path一定要和创建的时候path保持一致
共享
1. 不同浏览器之间不可以共享cookie
2. 一个服务器的多个应用间,默认不可以共享cookie,若设置为setPath("/"),则可以共享
注意
1. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
2. 浏览器一般只允许存放300个Cookie,每个站点最多存放20-50 个Cookie,每个Cookie的大小限制为4KB。
session
HttpSession
**服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中**
创建:
1. 获取HttpSession对象:
//无参,如果有session则返回一个,如果没有,则创建一个session
HttpSession session = request.getSession();
//有参,如果是true,则和无参数一样,如果是false,则没有session返回null
HttpSession session = request.getSession(true);
2. 使用HttpSession对象:
session.getID();
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
3. Session的实现是依赖于Cookie的。
执行过程
1. 第一次请求,没有带上cookie,则服务器会给当前的浏览器新建一个session对象,
同时把session的ID值,也就是JSESSIONID以响应头的形式发送给浏览器set-Cookie。
2. 第二次请求,浏览器会带啥cookie,服务器在拿到cookie之后,
解析出里面的JSESSIONID,找到相应的session,因为session已经存在,则不会再新建session了。
3. 为什么关闭浏览器之后,服务器又会重新新建一个session对象????
因为session的传递依赖于cookie,cookie默认的存在形式是存活在浏览器内存中,
所以当关闭浏览器再次重新打开,则cookie失效,等价于第一次请求。
注意事项
1. 客户端关闭,服务器不关闭,两次获取的session是否相同
//不相同
默认情况下,客户端关闭后,cookie消失,
session对象不会消失,处于不可达状态。
session的数据不会消失,session会被序列化到磁盘上,
再次访问会将序列化的session数据存入新的session对象中
//要想相同
要创建一个cookie对象,设置他的键为JSESSIONID,设置他的最大存活时间,让cookie持久化保存
Cookie cookie = new Cookie("JSESSIONID",session.getID());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
2. 客户端不关闭,服务器关闭,两次获取的session是同一个么
//不是同一个
关闭服务器,session对象会销毁,重新打开服务器,
会重新创建一个session对象,但是session中保存的内容不会丢失。
确保数据不丢失,tomcat自动完成以下工作
session的钝化:
在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
session销毁
1. 服务器关闭,session对象被销毁,数据存储
2. session对象调用invalidate();会销毁session数据
3 .session默认失效时间30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
session域
作用域是同一个用户的应用内
Context域:当前应用下所有的资源均可以使用的一个域
Session域:同一个浏览器,都可以访问的一个域(用户登录成功之后,将用户名放入session域中,接着进入个人主页,显示欢迎你,xxxxx,这个数据从session中获取。)
Request域:同一次请求内的资源可以访问,转发:源组件和目。标组件之间。
session的特点
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
浏览器禁用cookie后
//URL重写
response.encodeRedirectURL("path")//用于对sendRedirect方法后的url地址进行重写
response.encodeURL("path")//用于对表单action和超链接的url地址进行重写