简单学习 --> Cookie 和Session

Cookie是 http请求 header 中的一个属性; (是浏览器 持久化存储数据的一种 机制) ;

网页无法 访问 服务器的文件系统, 要存储数据就得使用其他方式 ;(Cookie 中保存的数据,也是 键值对格式(用户自定义的),最终也是要把这个键值对和请求一起发送回服务器的, 服务

Cookie 会存储:当前用户的身份信息

虽然 Cookie里的 的键值对 是用户自定义的,但有一个特殊情况,就是 Cookie会存储当当前用户的身份信息 (

例子:

复制代码
Cookie 类似于: 就诊卡,  卡里有你的 身份信息;
可以通过这个卡 ,在医院的系统上查询到 你的各种信息(年龄,地址,余额,生的什么病,病史....) ,
这些信息是不存在卡里,而是在系统了,不会说,卡丢了,信息就丢了 ;
卡只是存一个身份标识

上面说的一系列数据,每个人都会有数据,都是存在服务器里的,

这些数据都是在 数据库里的, 但 服务器执行操作的过程中, 数据就会从 数据库 查询出来,

先临时存在

这个内存结构就是

Session(会话)

Cookie 和 Session 这两个相互配合使用:

那么通过 SessionId就可以查询到,自己的 Session

服务器通过 hash表这样的 键值对结构来存储 Session (SessionId就是 key , Session 就是value, Session里又能存放各种用户信息(程序员自定义) )

发送请求(带有Cookie)时, 系统按 Cookie查询,就知道了当前用户的信息 ;

常用Cookie/Session的机制来完成 登录功能的实现 ;

Cookie 是浏览器的机制, Servlet 提供了api 来获取 Cookie ;

Session 是服务器 的机制, Servlet 内部也实现好了,提供了api 来使用 ;

关键类 : HttpServletRequest

方法

复制代码
1. Cookie[] getCookies()  获取请求中所有的 Cookie 内容 ;
一个Cookie对象就是一个键值对(name ,value)
​
2. HttpSession getSession()        能从Cookie中获取SessionId ,并且查询出Session ;
如果 SessionId 没有在hash表里 ,也能创建出 对象键值对(分配新的SessionId , 创建出新的HttpSession对象)
​
Servlet 就是通过 HttpSession类 来表示一个会话,  服务器上用来存储Session的hash表就类似于这样
HashMap<String, HttpSession> 这样的来存储Session ; 
            id    Session对象 
HttpServletResponse
复制代码
1. addCookie()  把Cookie 加到响应里 ;
HttpSession
复制代码
1. getAttribute()          Attribute:属性
2. setAttribute() 
​
Session对象里也是键值对结构的, 这些键值对属性,通过这两个方法来完成
复制代码
1. getName()
2. getValue()         
获取 Cookie的名字 和 值

实现登录页面

  1. 发起Http请求,触发登录(带上用户名,密码)

  2. 通过Servlet读取用户名和密码 ;验证是否登录成功 ;(登录成功,创建一个会话Session,并且把得到的SessionId,通过Cookie返回给客户端,客户端就会保存这个Cookie)

  3. 登录成功,跳转到页面主页(跳转到另一个Servlet页面,把刚才的用户数据显示到页面上) ;

登录页面
请求
处理请求

步骤

复制代码
1.读取请求参数,(username 和 password)
2. 验证用户名和密码,看是否正确,一般通过数据库
 3. 登录成功 ,创建会话 ;(会话创建好,可以保存一些信息)
 4. 登录成功, 跳转到网站首页(使用重定向, 本身就发送一个get请求)
 
 创建index主页
 5. 获取Session,拿到用户信息 
 6. 拿到会话信息,
 7. 拿到的数据,生成一个页面 (将数据写到响应里)
 
细节问题:
复制代码
处理请求
1. 在读取请求中的参数前设置字符集,防止getParameter乱码username
2. 判断username和password时, 让设置的 "密码".equals(username) , 防止 username为null
equals针对参数为null进行了处理
3. 登录成功,使用重定向,跳转到主页
主页操作
4. 要判断SessionId是否存在(在拿到Session对象后,判断Session是否为null)

查询/创建Session

创建好Session后,自动保存到hash表里, 把SessionId 设置到响应了(在header里加上Set-Cookie字段), 浏览器收到响应后把SessionId保存到Cookie里 ;

复制代码
getSession()创建出新的会话(生成SessionId,和Session,并且保存到hash表里), 把SessionId设置到 响应的
header中的set-Cookie字段中 ;
浏览器收到响应,就会把这个set-Cookie保存到浏览器的 Cookie中; 
浏览器保存SessionId到Cookie后; 这样后续访问服务器时,能够带上这个Cookie;
​
后面重定向到 index主页, 所发送的 get请求 , 就会带有Cookie,Cookie里就会有SessionId,这样有这个身份标识
后续 服务器的Servlet就会通过这个SessionId查询hash表,拿到刚才创建的Session对象 ;
这样同一个Session对象就可以拿到同一个属性数据 ;

数据共享

在getSession内部是拿着 SessionId去查询的,SessionId自然在同一个浏览器的访问/Cookie ,就能拿到同一个对象

前面设置了属性,后面也可以通过相同的key来拿到value,即使是在不同的servlet

Attribute

复制代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
@WebServlet("/login")
public class Login extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         // 1.读取请求参数,(username 和 password)
        //读取前设置一下字符集,防止getParameter乱码
        req.setCharacterEncoding("utf8");
        String username = req.getParameter("username") ;
        String password = req.getParameter("password") ;
         // 2. 验证用户名和密码,看是否正确,一般通过数据库
         // 这里直接把用户名和密码 设置好
        // zhangsan在前面防止 用户和密码 为null或其他错误
        if(!"zhangsan".equals(username)|| !"123".equals(password)){
            //如果用户名和密码对不上
            //登录失败, 给用户返回失败提示 ;
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("当前用户名或密码错误");
            return;
        }
        // 3. 登录成功 ,创建会话 ;
        HttpSession session = req.getSession(true);
        // 给会话保存一些,自定义的数据, Attribute也是键值对,存储什么数据都可以
        session.setAttribute("username" , username);
        session.setAttribute("loginTime" ,System.currentTimeMillis());
        // 4. 登录成功, 跳转到网站首页
        resp.sendRedirect("index");
​
    }
}
​
复制代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
//通过这个servlet生成页面
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取到当前用户的 会话对象 , 生成的页面要当前用户的信息
        HttpSession session = req.getSession(false) ; // 不需要创建Session对象,直接返回Session
        //  如果SessionId 不存在,没有在hash表中,则表示该用户不存在
        if(session == null) {
           resp.setContentType("text/html; charset=utf8");
           resp.getWriter().write("你当前尚未登录!");
            return ;
        }
        // 2. 从 会话中拿到用户信息
        String username = (String) session.getAttribute("username");
        Long longinTime = (Long) session.getAttribute("loginTime");
        //3. 把上面的数据生成页面
         resp.setContentType("text/html; charset=utf8");
         String respBody = "hello "+username +" 上次登录的时间为:"+longinTime ;
         resp.getWriter().write(respBody);
    }
}
​
登录状态

当登录成功, 后面在登录同一个网站,就不需要重新登录,会自动有登录信息 ;

当前登录的SessionId也有有效期,可以在Cookie里设置,让浏览器到时就删除掉,也可以让服务器到时就删除掉Session ;

相关推荐
咸甜适中1 小时前
rust语言学习笔记Trait之Default(默认值)
笔记·学习·rust
沪漂阿龙1 小时前
AI大模型面试题:模型求解和优化全解析——梯度下降、BGD、SGD、MBGD、学习率、Batch Size、损失函数、优化器一文讲透
人工智能·学习·机器学习
AOwhisky2 小时前
Docker 学习笔记:网络篇
linux·运维·网络·笔记·学习·docker·容器
24白菜头2 小时前
MySQL学习笔记
数据库·笔记·学习·mysql
小陈phd2 小时前
多模态大模型学习笔记(三十九)——生成式与Transformer式OCR:从“像素抄录“到“文档智能“的完整演进
笔记·学习·transformer
泡泡以安2 小时前
Unidbg学习笔记(一):为什么需要用户态模拟器
笔记·学习
栈溢出了2 小时前
GNN 学习笔记:edge_index 与 W 参数矩阵
人工智能·笔记·神经网络·学习
yanyu-yaya2 小时前
css篇之网格grid 学习
前端·css·学习
YangYang9YangYan3 小时前
2026新媒体运营学习数据分析的价值
学习·数据分析·新媒体运营