web 会话机制之 session cookie 详解

老板的苦恼假如你在繁华的街角开了一家店,每天客人络绎不绝 。
不过你作为老板却有一些苦恼,你想知道自己的顾客上一次是什么时候来的?
在店里的时候买了什么商品,方便购物的时候进一步提升用户体验 。
可是这些客人赤果果的来,无牵挂的走,店里一直没有留下客人的信息,聪明的你会怎么解决这个问题呢?

web 会话机制之 session cookie 详解

文章插图
 
输入图片说明
互联网没有记忆我们常说互联网没有记忆 。互联网背后的 HTTP 协议也是如此,正因为它无状态,所以足够简单,便于拓展,得以发展到今天这种局面 。
同时也正是因为 HTTP 协议无状态,所以对用户访问等缺乏识别记忆功能 。
那怎么解决这个问题呢?
目前有两张最主流的方式:cookie 和 session 。
cookieCookie 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现 Session 的一种方式 。
这个就好比我们把客户上次到店里的时间放在用户的口袋里,下次他们来的时候,我们拿出来看一下,就知道客户上次是什么时候来的了 。
当然这些信息用户自己是可以修改的,比如各种浏览器的 cookies 可以被清空 。
这让我想起来以前读的一个故事:
刚在路边摊准备买点小吃 。我说:老板我经常来买,给我便宜点吧 。老板说:我今天第一天摆摊 。
铁锅炖自己
信息都放在用户的口袋里虽然方便,但是服务端也要记一些必要的信息,不然被忽悠了都不知道 。
sessionSession 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
这个就类似于店里来客人了,服务员留心看一下,知道用户购物车里放了什么商品,是否需要帮助等等 。
Cookie 操作为了让大家直观的感受到 cookie 的使用,我们来看一下 CRUD 的例子 。
为了简单,此处使用 servlet 进行演示 。
web 会话机制之 session cookie 详解

文章插图
 
Cookie
说明【web 会话机制之 session cookie 详解】Cookie是浏览器保存信息的一种方式,可以理解为一个文件,保存到客户端了啊,服务器可以通过响应浏览器的set-cookie的标头,得到Cookie的信息 。
你可以给这个文件设置一个期限,这个期限呢,不会因为浏览器的关闭而消失 。
添加我们可以新建一个 cookie 返回给 resp 。
package com.github.houbb.simple.servlet;import JAVAx.servlet.annotation.WebServlet;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;/** * @author binbin.hou * @since 0.0.2 */@WebServlet("/cookie/add")public class CookieAddServlet extends HttpServlet {    private static final long serialVersionUID = 491287664925808862L;    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {        //1. 创建 cookie 信息        Cookie cookie = new Cookie("age", "10");        //30min        cookie.setMaxAge(30 * 60);        //2. 返回给客户端,用于客户端保存        resp.addCookie(cookie);        //3. 页面输出        resp.setCharacterEncoding("UTF-8");        resp.setContentType("text/html;charset=utf-8");        PrintWriter out = resp.getWriter();        // 后端会根据页面是否禁用 cookie,选择是否将 sessionId 放在 url 后面        String url = resp.encodeURL("/cookie/get");        out.println("<a href=https://www.isolves.com/it/cxkf/bk/2021-01-07/'"+url+"'>获取 cookie"); }}获取获取 cookie 也比较简单,直接通过 req.getCookies() 就可以获取到整个 cookie 列表 。


推荐阅读