目录
会话技术
一.Cookie入门
二.案例2:把浏览器发回来的cookie在服务器获取到
三,Cookie原理
四.Cookie使用注意
五.Cookie种类(持久化)
六.Cookie有效路径
七.Cookie唯一标识
Session
一.简述&入门案例
二.常见API
三,Session原理
四.Session生命周期
总结:
会话技术

会话技术: 相当于浏览器和服务器之间打电话的技术。
会话范围:(针对某个浏览器)
会话开始:某个浏览器开启了
会话结束:该浏览器关闭了
会话中,有无限次请求,无限次请求间都可以进行数据传递。
会话技术:
Cookie:保存在浏览器的会话技术
Session:保存在服务器的会话技术
一.Cookie入门
Cookie就相当于浏览器和服务器之间传递的一张小纸条。
服务器负责写小纸条,负责查看小纸条
浏览器负责保存小纸条,负责把小纸条展示给服务器看
作用:就是为了保存会话数据
入门Servlet:
/**
* cookie入门:向浏览器写一张小纸条:cookie
* @return
*/
public String run1(){
//key:value 都是字符串
//1、写一个小纸条
Cookie c = new Cookie("k1", "v1");
//2、传递给浏览器,让浏览器保存
getResponse().addCookie(c);
return null;
}
小结:
cookie的销毁是随着浏览器关闭而销毁的
创建cookie: new Cookie(“名字”,”值”);
传递给浏览器:response对象.addCookie(cookie对象);
二.案例2:把浏览器发回来的cookie在服务器获取到
服务器把cookie传递给浏览器: 响应头 set-cookie
浏览器把cookie传递回服务器: 请求头 Cookie
1、获取浏览器发来的所有cookie:request对象.getCookies();//返回一个cookie数组,如果没有任何cookie,返回null
2、获取cookie名:cookie对象.getName();
获取cookie值:cookie对象.getValue();
/**
* 获取浏览器发来的所有cookie,并展示控制台
* @return
*/
public String run2(){
//1、获取浏览器发来的所有cookie
Cookie[] arr = getRequest().getCookies();
//2、遍历cookie数组,打印每一个cookie的名字和值
if(arr!=null){
for (Cookie cookie : arr) {
System.out.println("名字:"+cookie.getName()+"\t 值:"+cookie.getValue());
}
}
return null;
}
三,Cookie原理

通过请求头和响应头进行数据传递
四.Cookie使用注意
1、cookie是由http协议制定,只要使用http协议,就可以使用cookie。浏览器、手机端
2、cookie保存是有上限。(数量上限,容量上限)
一个浏览器保存的cookie也是有上限。300
一个网站只能在一个浏览器上最多保存30个。
Cookie的value值不能太多,4K.
localstorage 4G
例如:商品浏览记录、上次访问记录、7天内自动登录。
3、cookie不能直接保存中文
不允许,报错。500
间接存中文
获取到值使用时,需要进行url解码。URLDecoder.decode
建议:cookie中不要保存中文。
五.Cookie种类(持久化)
持久化:把内存数据 保存到 硬盘文件中
Cookie分为两种:
- 保存在浏览器内存中的cookie(默认)。 特点是:浏览器关闭,cookie就会销毁
- 保存在浏览器对应的硬盘上(持久化cookie)。 特点:浏览器即使关闭,cookie也会保存下来(cookie的销毁与否和浏览器的关闭无关,和cookie自己的存活时间有关)
setMaxAge(int expiry) | 设置cookie的存活时间。 秒
浏览器必须打开着的,浏览器关闭cookie销毁
只要正整数大于0的,就会存活在浏览器对应的硬盘上,不以浏览器的关闭为销毁。 而是时间到期,就会自动销毁
|
代码:
/**
* 设置持久化cookie
* @return
*/
public String run3(){
//1、创建cookie
Cookie c3 = new Cookie("k3", "v3");
//设置存活时间
//c3.setMaxAge(-1);//默认
//c3.setMaxAge(60);//存活60秒
//c3.setMaxAge(60*60*24*7);//保存7天
c3.setMaxAge(0);//立刻过期,立刻删除cookie
//2、通过响应头传递给浏览器
getResponse().addCookie(c3);
return null;
}
六.Cookie有效路径
访问的路径等于或者包含 某个cookie的有效路径,这个cookie就会被发给服务器
Cookie会保存在硬盘上,保存路径,是由浏览器来自动控制。
请求某个路径时,浏览器需要带哪些cookie,才要根据cookie的有效路径来判断。
setPath(java.lang.String uri) | 设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。
http://localhost:8080/web/a/b/oneServlet,可访问(当前路径) http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径) http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径)
|
代码:
/**
* 设置有效路径
* @return
*/
public String run4(){
Cookie c4 = new Cookie("k4", "v4");
c4.setPath("/javaweb_day08_1"); //只要访问路径 等于或包含 /javaweb_day08_1,该cookie就可以被发给服务器
getResponse().addCookie(c4);
Cookie c5 = new Cookie("k5", "v5");
c5.setPath("/javaweb_day08_1/hehe");
getResponse().addCookie(c5);
Cookie c6= new Cookie("k6", "v6");
c6.setPath("/javaweb_day08_1/hehe/xixi");
getResponse().addCookie(c6);
return null;
}一般设置:setPath(“/项目名”);
适用于:发请求时,判断带哪个cookie
七.Cookie唯一标识
唯一标识:cookie的身份证
唯一标识=域名+有效路径+cookie名字
如果两个cookie唯一标识相同,同一个cookie,浏览器会进行覆盖保存(新的覆盖旧的)
如果两个cookie唯一标识不同,不同的cookie,浏览器会进行追加保存(分别保存两个cookie)
两个cookie:以下两个cookie因为域名不同,不同cookie,追加保存
域名:http://www.czxy.com 有效路径:/hehe cookie名:k1
域名:http://www.baidu.com 有效路径:/hehe cookie名:k1
两个cookie:以下两个cookie因为有效路径不同,不同cookie,追加保存
域名:http://www.czxy.com 有效路径:/hehe cookie名:k1
域名:http://www.czxy.com 有效路径:/xixi cookie名:k1
两个cookie:以下两个cookie因为cookie名不同,不同cookie,追加保存
域名:http://www.czxy.com 有效路径:/hehe cookie名:k1
域名:http://www.czxy.com 有效路径:/hehe cookie名:k2
两个cookie:相同cookie,新的覆盖旧的
域名:http://www.czxy.com 有效路径:/hehe cookie名:k1
域名:http://www.czxy.com 有效路径:/hehe cookie名:k1
有一个保存7天的cookie需要删除,以下哪个代码正确:
以下代码在同一个Servlet中:
Cookie c3 = new Cookie("k3", "v3"); c3.setMaxAge(60*60*24*7);//保存7天 getResponse().addCookie(c3);Cookie c4 = new Cookie("k3", "v3"); c4.setMaxAge(0); getResponse().addCookie(c4);因为同一个Servlet中,同一个tomcat中。
没有设置域名和有效路径,默认都是相同的。
Cookie名相同,所以唯一标识相同,相互覆盖
以下代码在同一个Servlet中:
Cookie c3 = new Cookie("k3", "v3");
c3.setPath(“/ddd”); c3.setMaxAge(60*60*24*7);//保存7天 getResponse().addCookie(c3);
Cookie c4 = new Cookie("k3", "v444");
C4.setPath(“/ddd”); c4.setMaxAge(0); getResponse().addCookie(c4);唯一标识相同,相互覆盖。 和value无关
Session
一.简述&入门案例
保存在服务器的会话技术。
会话范围:针对的是某个浏览器(N次请求)
Session是一个最常用的域对象。
- Request:最小域对象。 针对某次请求
- Session:针对某个浏览器(某个用户),会话范围
- ServletContext:最大域对象。针对整个项目内部
入门案例:
获取session对象
/**
* 入门:获取session对象
* @return
*/
public String run1(){
//方式一:
HttpSession s1 = getRequest().getSession();
//方式二:
HttpSession s2 = getSession();
//s1和s2在这里是同一个对象
return null;
}
二.常见API
方法声明 | 功能描述 |
String getId() | 用于返回与当前HttpSession对象关联的会话标识号 |
long getCreationTime() | 返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式 |
long getLastAccessedTime() | 返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式 |
void setMaxInactiveInterval(int interval) | 用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔 |
boolean isNew() | 判断当前HttpSession对象是否是新创建的 |
void invalidate() | 用于强制使Session对象无效。 强制销毁对应session对象。 |
ServletContext getServletContext() | 用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象 一般都是通过 this.getServletContext(); |
void setAttribite(String name,Object value) | 用于将一个对象与一个名称关联后存储到当前的HttpSession对象中 |
String getAttribute() | 用于从当前HttpSession对象中返回指定名称的属性对象 |
void removeAttribute(String name) | 用于从当前HttpSession对象中删除指定名称的属性 |
案例1:把session作为一个域对象使用(会话范围,针对某个浏览器)
/**
* 从session作用域删除数据
* @return
*/
public String run4(){
getSession().removeAttribute("uname");
return null;
}
/**
* 从session作用域获取数据
* @return
*/
public String run3(){
Object uname = getSession().getAttribute("uname");
System.out.println(uname);
return null;
}
/**
* 向session作用域保存数据
* @return
*/
public String run2(){
getSession().setAttribute("uname","严严");
return null;
}
案例2:其他API
/**
* session常见API
* @return
*/
public String run5(){
String id1 = getSession().getId();
System.out.println("id1:"+id1);
boolean f = getSession().isNew();
System.out.println(f);
//立刻销毁当前session对象
getSession().invalidate();
//销毁session时,建议调用getRequest().getSession()获取到的新session
// String id2 = getSession().getId();//直接getSession()只能获取到被销毁的session
String id2 = getRequest().getSession().getId();
System.out.println("id2:"+id2);
return null;
}
三,Session原理

四.Session生命周期
创建:第一次调用getSession() 创建
销毁:
1、服务器非正常关闭
服务器正常关闭时,session对象会序列化方式保存到硬盘上
下次服务器正常启动时,硬盘数据就会回到内存中。
2、主动调用invalidate()
3、超过30分钟没有调用session
总结:
会话技术:
Cookie:保存在浏览器端(客户端)会话技术
- 创建cookie对象:new Cookie(“名字”,”值”);
- 把cookie写出响应头:response对象.addCookie(cookie对象);
- 获取浏览器发来的所有cookie:request对象.getCookies();//返回一个cookie数组,如果一个cookie都没有,返回null
- 获取cookie的名字:cookie对象.getName();
- 获取cookie的值: cookie对象.getValue();
- 持久化cookie:
默认cookie:setMaxAge(-1); 浏览器关闭,销毁
持久化cookie:setMaxAge(大于0); 生存时间到期,销毁
- 设置cookie有效路径:
请求路径 等于/包含 cookie的有效路径,该cookie会被发送给服务器
setPath()
- 唯一标识:
覆盖保存:唯一标识相同
分别保存:唯一标识不同
Session:保存在服务器端的会话技术
Session作用域。
Request:最小作用域。针对某次请求
Session:针对某个浏览器(某个用户) 会话范围(浏览器开启----浏览器关闭)
ServletContext:最大作用域,针对整个项目内部
严重依赖cookie技术。 Cookie中会保存session的id。JSESSIONID
- session.getId()获取sessionid
- session.isNew();为true是新session
- session.invalidate(); 立刻销毁session
- session.setAttribute(key,value);
- session.getAttribute(key);//返回值Object
- session.removeAttribute(key);
session生命周期:
创建:第一次调用getSession()
销毁:
1、服务器非正常关闭
2、调用invalidate()
3、超过30分钟未访问
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!
注: 如果本篇有需要改进的地方或错误,欢迎大神们指定一二~~



















