能够简单的理解为:用户打开浏览器,访问多个web资源,而后关闭浏览器,这个过程能够称为一次会话
php
有状态会话:能够简单理解为一个同窗来了这个教室,下一次再来咱们知道他来过这个教室,咱们能够称这个过程为有状态会话html
管理浏览器与客户端之间会话过程当中产生的会话数据。java
实现资源之间的数据共享web
已经知道了其中两个(ServletContext和Request)api
登陆场景:浏览器
打开浏览器 -> 浏览到登录页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名)缓存
修改密码(输入原密码)服务器
修改收货地址cookie
一、假设用Contextide
小张: 输入“张三” (保存数据: context.setAttribute("name","张三")) -> 用户主页(显示“张三”)
小李: 输入“李四”(保存数据:context.setAttribute("name","李四")) -> 用户主页(显示“李四”)
问题: context是全部用户公有的资源!!!会覆盖数据。
二、假设使用request
小张: 输入“张三”(保存数据: request.setAttribute("name","张三"))- > 用户主页(显示“张三”)
问题: 必定要将凡有用户信息的页面都采用转发技术!!!实现过于复杂和不易
这个时候咱们可使用cookie技术(Cookie技术:会话数据保存在浏览器客户端。)
指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(一般通过加密)。
用途:由于HTTP协议是无状态的,即服务器不知道用户上一次作了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结账时,因为HTTP的无状态性,不经过额外的手段,服务器并不知道用户到底买了什么。 因此Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器能够设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
应用场景:Cookie另外一个典型的应用是当登陆一个网站时,网站每每会请求用户输入用户名和密码,而且用户能够勾选“下次自动登陆”。若是勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登陆了。这正是由于前一次登陆时,服务器发送了包含登陆凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登陆时,(若是该Cookie还没有到期)浏览器会发送该Cookie,服务器验证凭据,因而没必要输入用户名和密码就让用户登陆了。
Cookie的核心API
Cookie类的主要方法 |
|||
No. |
方法 |
类型 |
描述 |
1 |
构造方法 |
实例化Cookie对象,传入cooke名称和cookie的值 |
|
2 |
public String getName() |
普通方法 |
取得Cookie的名字 |
3 |
public String getValue() |
普通方法 |
取得Cookie的值 |
4 |
public void setValue(String newValue) |
普通方法 |
设置Cookie的值 |
5 |
public void setMaxAge(int expiry) |
普通方法 |
设置Cookie的最大保存时间,即cookie的有效期,当服务器给浏览器回送一个cookie时,若是在服务器端没有调用setMaxAge方法设置cookie的有效期,那么cookie的有效期只在一次会话过程当中有效,用户开一个浏览器,点击多个超连接,访问服务器多个web资源,而后关闭浏览器,整个过程称之为一次会话,当用户关闭浏览器,会话就结束了,此时cookie就会失效,若是在服务器端使用setMaxAge方法设置了cookie的有效期,好比设置了30分钟,那么当服务器把cookie发送给浏览器时,此时cookie就会在客户端的硬盘上存储30分钟,在30分钟内,即便浏览器关了,cookie依然存在,在30分钟内,打开浏览器访问服务器时,浏览器都会把cookie一块儿带上,这样就能够在服务器端获取到客户端浏览器传递过来的cookie里面的信息了,这就是cookie设置maxAge和不设置maxAge的区别,不设置maxAge,那么cookie就只在一次会话中有效,一旦用户关闭了浏览器,那么cookie就没有了,那么浏览器是怎么作到这一点的呢,咱们启动一个浏览器,就至关于启动一个应用程序,而服务器回送的cookie首先是存在浏览器的缓存中的,当浏览器关闭时,浏览器的缓存天然就没有了,因此存储在缓存中的cookie天然就被清掉了,而若是设置了cookie的有效期,那么浏览器在关闭时,就会把缓存中的cookie写到硬盘上存储起来,这样cookie就可以一直存在了。 |
6 |
public int getMaxAge() |
普通方法 |
获取Cookies的有效期 |
7 |
public void setPath(String uri) |
普通方法 |
设置cookie的有效路径,好比把cookie的有效路径设置为"/xdp",那么浏览器访问"xdp"目录下的web资源时,都会带上cookie,再好比把cookie的有效路径设置为"/xdp/gacl",那么浏览器只有在访问"xdp"目录下的"gacl"这个目录里面的web资源时才会带上cookie一块儿访问,而当访问"xdp"目录下的web资源时,浏览器是不带cookie的 |
8 |
public String getPath() |
普通方法 |
获取cookie的有效路径 |
9 |
public void setDomain(String pattern) |
普通方法 |
设置cookie的有效域 |
10 |
public String getDomain() |
普通方法 |
获取cookie的有效域 |
(1)、服务器段建立cookie的对象,同时把会话的数据存放到cookie中
//一、建立Cookie对象 Cookie cookie=new Cookie("name", "gqxing");
(2)、服务器端发送cookie信息到浏览器(同时对其设置一些附加操做)
//二、把cookie数据发送给浏览器(经过响应头发送:set-cookie) // response.setHeader("set-cookie",cookie.getName()+"="+cookie.getValue()); //以上方法太过于麻烦,如下方法直接以键值对的形式将cookie发送(推荐) response.addCookie(cookie);
(3)、浏览器收到cookie数据,将其放在浏览器端
(4)、浏览器在下次访问服务器时,会带着cookie信息。
将cookie的信息封装在请求头中。
(5)、服务器收到浏览器带来的cookie信息
//三、接受浏览器返回的cookie信息 //String cookieValue=request.getHeader("cookie"); //以上方法不面向对象,使用下面方法 Cookie[] cookies=request.getCookies(); //注意须要判断是否为空 if (cookies!=null) { for (Cookie cookie2 : cookies) { String name=cookie2.getName(); String value=cookie2.getValue(); System.out.println(name+"="+value); } }else { System.out.println("没有接收到cookie数据"); }
一、为cookie设置访问路径,若浏览器初始的时候保留有两个cookie值且其路径以下所示:
Cookie cookie1=new Cookie("name", "gqxing"); Cookie cookie2=new Cookie("password", "123456"); /** * 设置cookie的有效路径 * 默认状况下:有效路径在当前web应用下,/CookieSession *如今设置其路径 */ cookie1.setPath("/CookieSession"); cookie2.setPath("/TestDemo"); response.addCookie(cookie1); response.addCookie(cookie2);
当浏览器访问服务器的时候,发送请求的时候,同时访问的路径为“/CookieSession”的时候
void setCookie(int expiry):设置coookie的有效时间
正整数:表示cookie数据保存在浏览器的缓存目录中(硬盘),数值表示保存的时间
负整数:表示cookie数据保存在浏览器的内存中,浏览器关闭cookie的值就会遗失
零:表示删除同名的cookie数据
如:
Cookie cookie =new Cookie("age", "21"); cookie.setPath("/CookieSession"); //表示该cookie会在浏览器的硬板上存在二十秒钟,即便关闭浏览器,再打开仍是同样存在 // cookie.setMaxAge(20); //为负数,cookie会保留在内存中。又称为会话cookie(一次会话表明浏览器的关闭) cookie.setMaxAge(-1); response.addCookie(cookie); //接收cookie Cookie[] cookies=request.getCookies(); if (cookies!=null) { for (Cookie cookie2 : cookies) { System.out.println(cookie2.getName()+":"+cookie2.getValue()); } }else { System.out.println("没有接收到相对应的cookie数据!"); }
当咱们不太想用某个cookie或者由于某种状况须要删除该cookie,咱们能够用上面的方法,将其值设为零
//将同一个路径下的通名称的cookie删除掉 //要注意的是只要cookie的名字相同就好就好,好比这里的cookie的名字叫作“age”,注意在上面的代码中咱们也设置一样的“age” Cookie cookie=new Cookie("age", "XXX"); cookie.setMaxAge(0); response.addCookie(cookie); System.out.println("删除成功!");
注意:最好不要在cookie中设置中文,以避免乱码。