目录
上篇博客分享了关于request和response的学习,今天介绍一下关于cookie和session的学习。
cookie和session是一种会话技术,那么什么是会话技术呢?在日常生活中,从拨通电话到挂断电话之间的一连串你问我答的过程就是一个会话,在B/S架构中,从浏览器第一次给服务器发送请求时开始建立会话,直到一方断开,会话结束.再一次会话中包含了多次请求.
cookie:浏览器端会话技术(数据保存到浏览器上)
session:服务器端会话技术(数据保存在服务器上)
cookie
cookie将产生的数据保存在浏览器端,在服务器端创建,是一种key/value的格式,通过响应写会浏览器的,下次请求的使用按照一点的规则携带cookie到服务器上.
执行原理:
相关方法:
构造器:
new Cookie(String name, String value)
写回浏览器方法:
response.addCookie(Cookie c)
获取cookie:
request.getCookies()
cookie方法:
----->getName() :获取cookie的名字
----->getValue() :获取cookie的值
注意:
1)响应的cookie是通过set-cookie的响应头带回给浏览器的
2)请求的cookie是通过cookie的请求头发送给服务器的
代码案例:
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//有数据产生 需要被保存
Cookie cookie = new Cookie("ds" , "James");
//保存数据 将cookie交给响应对象 响应给了浏览器
response.addCookie( cookie );
}
}
public class TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据请求获得cookie数据
Cookie[] cookies = request.getCookies();
//判断cookie
if(cookies != null){
//遍历
for (Cookie cookie : cookies) {
//获得cookie的名称 和 cookie值部分
System.out.println(cookie.getName() +"====" + cookie.getValue());
}
}else{
System.out.println("暂时还没有获取到cookie的信息");
}
}
}
会话级别的cookie:浏览器打开服务器到浏览器关闭的时候,此次会话过程中的数据保存在会话结束cookie就消失了
API
方法名 | 作用 |
---|---|
setMaxAge(int 秒数) | 设置cookie在浏览器的存活时间 , 设置持久化级别的cookie |
setPath("路径") | 设置cookie的路径,规定访问页面的时候携带哪些cookie setPath("/") |
setMaxAge(int 秒数)
- 若为正整数的时候,设置指定的存活时间
- 若为负数的时候,浏览器关闭的时候,此cookie销毁
- 如果0的时候,立即销毁此cookie(路径一致)
public class OneAPIServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//有数据产生 需要被保存
Cookie cookie = new Cookie("dzd" , "小强3333");
//设置cookie的存活时间(1天)
cookie.setMaxAge(60 * 60 * 24 * 7);//单位秒
}
}
设置路径问题:
1.cookie的默认路径为:访问的servlet的路径,从项目的应用路径开始,到最后一个"/"结束.
例如:访问路径为:"/day08_cookie/demo01",cookie的默认路径为/day08_cookie
访问路径为"/day08_cookie/a/demo1" ,cookie的默认路径/day08_cookie/a
2.当我们访问url包含此cookie的路径,就会携带此cookie,若不包含就不携带.
例如{一下三个路径}:
cookie1的路径: /day08_cookie/a/b
cookie2的路径: /day08_cookie/a
cookie3的路径: /day08_cookie
当我们访问一下路径的时候,携带cookie的数量不同:
- 访问的路径为 http://localhost/day08_cookie/a/b/1.html的时候,会携带3个cookie
- 访问的路径为 http://localhost/day08_cookie/a/1.html的时候,会携带2和3这俩cookie
- 访问的路径为 http://localhost/day08_cookie/1.html的时候,会携带第3个cookie
cookie的特点:
- 一个浏览器下一个名字和一个路径只能确定一个cookie,若再写回来同名cookie会覆盖之前的cookie
- 名字或路径不通,cookie就可以同时存在
- cookie不能跨浏览器
- cookie的value可以存放中文(tomcat8 ),但是不能存放空格 ","和";"
- 如果有这些特殊符号的时候,我们需要先将value进行编码,获取到值之后再按指定的编码进行解码即可
- 编码的时候建议使用URLEncode.encode("要编码的字符串","utf-8")
- 解码的时候建议使用URLDecode.decode("要解码的字符串","UTF-8")
public class TeShu_Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String s = "我爱你,中 国;";
//编码
String s_8 = URLEncoder.encode(s, "utf-8");
Cookie cookie = new Cookie("demo1", s_8);
response.addCookie(cookie);
//第一次获取不到此cookie的,但是第一次之后再访问就可以获取了
Cookie[] cookies = request.getCookies();
if (cookies!=null&&cookies.length>0) {
for (Cookie c : cookies) {
if ("demo1".equals(c.getName())) {
String value = c.getValue();
//解码
value = URLDecoder.decode(value,"utf-8");
System.out.println(value);
}
}
}
}
}
session
服务器端会话技术:在一次会话的多次请求之间共享数据,将数据保存到服务器端
工作流程:
当浏览器访问服务器的时候,服务器会看浏览器是否携带了id(JSESSIONID)
如果没有带,服务器会在服务器上创建一块空间,然后操作数据,服务器会将这个控件的id(JSESSIONID)通过响应返回给浏览器
如果携带,服务器获取这个id,通过id去内存中查找是否有这块空间{如果存在,会直接将 数据存入这块控件,如果没有找到,服务器会在服务器上创建一块空间,操作数据,服务器会将这个空间的id(JSESSIONID)通过响应返回给浏览器}
基本使用:
常用方法:
setAttribute(String key , Object value) 设置属性值
getAttribute(String key) 获取属性值
removeAttribute(String key) 移除属性值
执行原理:
代码案例:
public class SessionOneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得session(第一次调用会创建session对象)
HttpSession session = request.getSession();
System.out.println(session);
System.out.println(session.getId());//手动获得session的id
System.out.println(session.isNew());//是不是新创建的
session.setAttribute("ds","James");
}
}
public class SessionTwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得session(第一次调用会创建session对象)
HttpSession session = request.getSession();
System.out.println(session);
System.out.println(session.getId());//手动获得session的id
System.out.println(session.isNew());//是不是新创建的
System.out.println( session.getAttribute("ds") );
}
}
session的声明周期:
创建:默认情况下,第一次访问reqeust.getSession()创建
销毁:
- 默认tomcat服务器中,超过三十分钟销毁(一个session如果30分钟内没有任何人操作,自动销毁)
- 手动调用invalidate方法销毁
- 服务器非正常关闭则销毁(死机,蓝屏)
服务器正常关闭: 将内存的session数据序列化到了本地磁盘上(work下 sessions文件中) , 再次启动服务器 加载session文件 到内存, 数据再加载回来 数据并没有消失
cookie和session小结:
- cookie:数据存储再来浏览器,cookie存储的数据优先,cookie不安全
- session:数据存储在服务器,session存储数据无限(取决于服务器的大小,session相对安全)