1,会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭资源,这个过程称为会话
Cookie作用
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。
Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
Cookie缺陷:
- Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
- 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用超文本传输安全协定。
- Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。[3]
有状态会话:
理解:
Cookie:服务端给客户端的一个信件,客户端下次访问服务端带上信件就可以了
Session:服务端登记你来过了,下次来时在服务端匹配session
cookie和session的区别:
1.Session比Cookie安全,
2.Session是存储在服务器端的,Cookie是存储在客户端的
1.2 保存会话的两种信息
cookie
客户端技术 (响应,请求)
session
服务器技术,利用这个技术,可以保存用户会话信息,可以把信息或者数据放在session中
常见案例:网站登录之后,下次不用再登录,第二次访问就直接进入
1.3 Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
1. Cookie[] cookies = req.getCookies();//获得cookie方法 2. cookie.getname();//获得cookie中的key 3. cookie。getvalue();//获得cookie中的value 4.new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一个cookie 5.cookie.setMaxAge(24*60*60);设置有效期 6.resp.addCookie(cookie);//响应给客户端cookie
cookie:一般保存在本地的用户目录下appdata;
一个网站cookie是否存在上限!
一个Cookie只能保存一个信息
一个web站点可以给浏览器发送多个cookie,最多存放cookie
Cookie大小有限制4kb
300个cookie浏览器上限
删除Cookie:
不设置有效期,关闭浏览器,自动失效;
设置有效期时间 0 ;
获取cookie
package com.king.servlet; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; //保存用户上一次访问时间 public class CookieDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器把客户端上一次访问的时间封装成一个cookie,下次来时,就可凭cookie。被服务端识别 //解决中文乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); //cookie,服务器端从客户端获取 Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可返回多个 //判断cookie是否存在 if(cookies!=null){ //如果存在的操作 out.write("你上一次访问的时间是:"); for (Cookie cookie : cookies) { //获取cookie的名字 if(cookie.getName().equals("lastLoginTime")){ //获取cookie中的值 long lastLoginTime = Long.parseLong(cookie.getValue()); Date date = new Date(lastLoginTime); out.write(date.toLocaleString()); } } }else{ out.write("这是您第一次访问本站"); } //服务器给客户端响应一个cookie; Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+""); //设置cookie有效期一天 cookie.setMaxAge(24*60*60); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
删除cookie
package com.king.servlet; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; public class CookieDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器给客户端响应一个cookie; Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+""); //设置cookie为0,立马过期 cookie.setMaxAge(0); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <servlet> <servlet-name>CookieDemo01</servlet-name> <servlet-class>com.king.servlet.CookieDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo01</servlet-name> <url-pattern>/c1</url-pattern> </servlet-mapping> <servlet> <servlet-name>CookieDemo02</servlet-name> <servlet-class>com.king.servlet.CookieDemo02</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo02</servlet-name> <url-pattern>/c2</url-pattern> </servlet-mapping> </web-app>