cookie (1)cookie是什么
(2)cookie从哪里来
(3) cookie到哪里去
(4)cookie存储到哪里
cookie的典型应用
cookie和session的区别
模拟登录代码
一.(1)Cookie是什么?Cookie 是浏览器提供的持久化存储数据的机制
(2)Cookie从哪里来?Cookie是从服务器返回给浏览器的,服务器代码中由程序猿决定要把啥样的信息保存到客户端这边,通过Http响应的Set-Cookie字段,把键值对写回去。
(3)Cookie到哪里去?Cookie 会在后续浏览器访问服务器的时候带到请求的header中,发给服务器,因为服务器不只是只给一个客户端提供服务,同一时刻要处理多个客户端,此时服务器可以通过cookie中的值,来识别当前客户端是谁,当前客户端的服务提供到那个环节了。
(4)Cookie存储在哪里?存储在浏览器(客户端)所在主机的硬盘上,浏览器会根据域名来分别进行存储。
Cookie的典型应用(标识用户的身份信息)
服务器不知道身份信息,针对登录操作,京东会查询数据库,验证用户名和密码,是否正确,如果正确,登录成功,京东就会把当前的用户信息,在内存中也会 保存一份,同时给这个用户分配一个表示身份的序号把这个生成的唯一身份序号称为sessionid,服务器会使用像hash表这样的结构,把身份序号作为key,身份信息作为value,以键值对的方式存储起来,服务器把这些生成的键值对称之为session(会话),
后序请求中,服务器收到Cookie中的身份序号,就会查询上述hash表,判定用户是谁,如果查到,就知道用户是谁(避免重复输入账号密码),如果没查到就会要求用户重新登录。
Cookie和Session的关联和区别
关联:在网站的登陆过程中,需要配合使用
区别:Cookie是客户端的存储机制,Session是服务器的存储机制,Cookie里面可以存各种键值对(还可以存别的),Session则专门用来保存用户的身份信息。
Cookie完全可以单独使用,不搭配session(实现非登录场景下)Session也可以不搭配Cookie使用(例如手机app登录服务器),Cookie跟浏览器强相关
Cookie属于HTTP协议中的一部分,Session则可以和HTTP无关(TCP,websocket,也可以使用session)。
二.一个模拟登录这样的代码:
编写登录页面
编写LoginServlet处理登录请求
getSession(true) 判定当前请求是否已经有对应的会话了(拿着请求里的sessionId)不存在,或者没查到就创建新会话,并插入到哈希表中,如果查到了,直接返回查到的结果
会话创建过程:会话包括两部分:1.key是sessionId 2.value是一个HttpSession对象,每个客户端登录的时候都会有一个这样的键值对(会话),服务器要管理多个这样的会话。服务器可以搞一个哈希表,把这些会话组织起来。其具体过程:1.构造一个HttpSession对象 2.构造唯一的sessionId 3.把这个键值对插入到哈希表中4.把sessionId设置到响应报文中,Set-Cookie字段中。
会话这里,服务器组织:
编写Indexservlet
@WebServlet("/index")
public class Indexservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session=req.getSession(false);/if(session==null){System.out.println("用户未登录");resp.sendRedirect("login.html");return;}String username=(String)session.getAttribute("username");//getAttribute方法来取键值对resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("欢迎"+username+"回来!");}
}
第一次交互:
第二次交互:
getSession(true)方法和getSession(false)的区别:
都是拿着sessionid去哈希表里找会话,第一个方法找到了就返回现成的,如果没找到会创建这样一个对话,而第二个找到了返回现成的,如果没找到,返回null,不会进行创建。
整个登录过程,就像去医院看病一样
首次到医院,,需要挂号,办理就诊卡(登录,创建会话,分配sessionId),我们的身份信息进入了医院的系统了,给我们发的就诊卡里,包含了我们的sessionid,后续去具体科室检查:进入呼吸科,医生开始检查,检查信息进入系统,相当于在HttpSession中设置了一些attribute,又来到发烧门诊,医生又把检查结果放到了系统,相当于在HttpSession里又设置了一些attribute.每次刷卡,都是拿着sessionId来查询系统,获取到会话对象,进一步得到里面的attributr,知道要做那些检查和结果,就诊卡里就是cookie里面存了sessionId.