再谈 Cookie 和 Session

文章目录

    • 1. 核心方法:
      • HttpServletRequest 类中
      • HttpServletResponse 类中
      • HttpSession类中
      • Cookie类中
    • 2.实现登录界面

Cookie 是浏览器在本地持久化存储数据的一种机制。

Cookie 的数据从哪里来?

是服务器返回给浏览器的。

Cookie 的数据长什么啥样??

Cookie 中是键值对结构的数据,并且这里的键值对都是程序猿自定义的。

Cookie 有什么作用?

Cookie 就是可以在浏览器这边存储一些“临时性数据”。其中最典型的一种使用方法,就是用来存储“身份标识”。

身份标示就是 sessionid ,这里就涉及到 Cookie 和 Session 之间的联动了。Cookie 是在浏览器中存储,Session 是在服务器中存的。为了能存储每个用户的详细信息,这里给每个用户分配一个 sessionid(唯一值)。后续再访问该网站的其他页面,请求中就会带上刚才的 sessionid ,进一步的服务器就可以知道当前是哪个用户在操作。

Cookie 到哪里去了?

Cookie 的内容会在下次访问该网站的时候,自动的被带到 HTTP 请求中。

Cookie 怎么存的??

浏览器按照不同的“域名”,分别存储Cookie。域名和域名之间的 Cookie 是不能干扰的。Cookie 是存储在硬盘上的,而且存储往往会有一个超时的时间。


结合 servlet,进一步的针对 cookie 和 session 进行一些实战操作。

1. 核心方法:

HttpServletRequest 类中

方法描述
HttpSession getSession()在服务器中获取会话。参数如果为true,则当不存在会话时新建会话;反之,不存在会话返回null。
Cookie[] getCookies()返回一个数组,包含客户端发送该请求的所有Cookie对象。会自动把Cookie中的格式解析成键值对。

HttpServletResponse 类中

方法描述
void addCookie(Cookie cookie)把指定的 Cookie 添加到响应中

HttpSession类中

方法描述
Object getAttribute(String name)该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null
void setAttribute(String name, Object value)该方法使用指定的名称绑定一个对象到该 session 会话
boolean isNew()判定当前是否是新创建出的会话

Cookie类中

方法描述
String getName()该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是 SetCooke 字段设置给浏览器的)
String getValue()该方法获取与 cookie 关联的值
void setValue(String newValue)该方法设置与 cookie 关联的值。
//访问 setCookie 请求的时候,代码中就会构造 Cookie 放到响应中
@WebServlet("/setCookie")
public class setCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("data","2024-3-9");
        resp.addCookie(cookie);
        Cookie cookie2 = new Cookie("time","16:45");
        resp.addCookie(cookie2);
        resp.getWriter().write("setCookie  ok");
    }
}

@WebServlet("/getCookie")
public class getCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if(cookies != null) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        } else {
            System.out.println("请求中没有 Cookie");
        }
        resp.getWriter().write("ok");
    }
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置完Cookie后浏览器中就可以看到了,后续再次发送,服务器就能拿到 cookie 内容(因为浏览器中已经有了)外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


2.实现登录界面

这个过程中,感觉到,Cookie 里的数据只是在浏览器暂时歇歇脚。实际上真正发挥作用,还是得在服务器这边的逻辑中生效的。

下面还可以使用 Cookie 结合 Session 实现登录效果。此时就能更清楚的看出来,当前Cookie工作过程了。

Servlet 也提供了Session 相关的支持。实现登录功能,不需要直接使用Cookie api,直接使用 session 的 api 就可以了。

登录页面代码逻辑:

  1. 获取到用户名和密码
  2. 验证用户输入的账号密码是否正确
  3. 如果登录成功则创建对话,在会话中保存自定义的数据。
  4. 让页面自动跳转

跳转页面代码逻辑:

  1. 验证用户登录状态( 用getSession(false) )
  2. 如果验证为登录状态,则根据Session中的内容构造页面

前端简易代码(form表单的形式):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录</title>
</head>
<body>
    <form action="login" method="post">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" value="登录">
    </form>
</body>
</html>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 loginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取到用户名和密码
        String userName = req.getParameter("username");
        String password = req.getParameter("password");
        if(userName == null || password == null || userName.equals("") || password.equals("")) {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("请求的参数不完整!!");
            return;
        }

        //2.验证用户密码是否正确
        //  username = 张三,password = 000;
        if (!userName.equals("张三")) {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("用户名错误");
            return;
        }
        if (!password.equals("000")) {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("用户密码错误!!");
            return;
        }

        //3.用户登录成功!! 此时就可以给这个用户创建会话了。
        //效果有两方面:(true)
        //  (1)如果当前用户没有 session,就会创建出 session
        //  (2)如果已经有了 session,就能够查询到这个session
        HttpSession session = req.getSession(true);

        //在会话中保存自定义的数据
        session.setAttribute("time",System.currentTimeMillis());
        session.setAttribute("username",userName);

        // 让页面自动跳转
        //用servlet生成一个动态页面
        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;

//跳转页面
@WebServlet("/index")
public class indexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //验证用户登录状态
        HttpSession session = req.getSession(false);
        if(session == null) {
            //用户尚未登录
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("请先登录,再访问主页!!");
            return;
        }
        //已经登录成功了
        String username = (String) session.getAttribute("username");
        Long time = (Long) session.getAttribute("time");

        System.out.println("username = " + username + "time = " + time);

        //根据这样的内容构造主页
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("欢迎您," + username + "上次登录的时间是:" + time );
    }
}

m.out.println("username = " + username + "time = " + time);

    //根据这样的内容构造主页
    resp.setContentType("text/html;charset=utf8");
    resp.getWriter().write("欢迎您," + username + "上次登录的时间是:" + time );
}

}


![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C28779%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240310183935606.png&pos_id=img-lBJRvTVV-1710067642243)![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C28779%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240310183941880.png&pos_id=img-idrUzchG-1710067642244)![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C28779%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240310184024164.png&pos_id=img-mqgKlGA0-1710067642244)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447235.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chapter20-Ideal gases-CIE课本要点摘录、总结

20.1 Particles of a gas Brownian motion Fast modules 速率的数值大概了解下&#xff1a; average speed of the molecules:400m/s speed of sound:approximately 330m/s at STP&#xff08;standard temperature and pressure&#xff09; Standard Temperature and Pres…

不同路径 不同路径 II 整数拆分

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。…

标准不锈钢电阻-栅极电阻器的设计方案

EAK不锈钢栅极电阻器 可靠的不锈钢电阻元件和端子 所有装置均为三重绝缘&#xff0c;适用于 1000V 交流或直流 标准电网电阻器有现货&#xff0c;可减少代价高昂的停机时间 在很宽的温度范围内具有稳定的耐受性 高功率可节省空间、重量和成本 标准 26.5 英寸尺寸&#xf…

PDF24 Creator PDF工具箱 v11.17.0

软件介绍 可将大部分文件转成pdf格式的免费软件&#xff0c;安装好后会在你的打印机里看到一个叫PDF24的虚拟打印机&#xff0c;你可将要转成pdf格式的文件打印时选虚拟打印机PDF24&#xff0c;也可以直接将文件以拖拉方式拉进这软件的主视窗编辑区里&#xff0c;它会自动转成…

OD_2024_C卷_200分_6、六_连续出牌数量【JAVA】【回溯算法】

题目描述 package odjava;import java.util.Arrays; import java.util.Scanner;public class 六_连续出牌数量 {// 定义扑克牌类static class Card {int num; // 牌号char color; // 花色public Card(int num, String color) {this.num num;this.color color.charAt(0); // 取…

Liinux——(网络)socket编程

预备知识 源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址 认识端口号 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪个进程来处理;IP地址 端口号能…

js【详解】DOM

文档对象模型&#xff08;Document Object Model&#xff0c;简称DOM&#xff09; DOM 是哪种数据结构 &#xff1f; DOM 的本质是浏览器通过HTML代码解析出来的一棵 树。 操作 DOM 常用的 API 有哪些 &#xff1f; 获取 DOM 节点 //方式 1&#xff1a;通过【id】获取&#xf…

每日学习笔记:C++ STL 的队列Deque

定义 内存模型 Deque与Vector比较 操作函数 运用实例

每日OJ题_牛客HJ73 计算日期到天数转换(IO型OJ)

目录 牛客HJ73 计算日期到天数转换 解析代码 牛客HJ73 计算日期到天数转换 计算日期到天数转换_牛客题霸_牛客网 解析代码 #include <iostream> using namespace std; int main() {int year 0, month 0, day 0, sum 0;cin >> year >> month >>…

文本向量评测MTEB和C-MTEB

文章目录 简介MTEBC-MTEB参考资料 简介 MTEB(Massive Text Embedding Benchmark)是目前评测文本向量很重要的一个参考&#xff0c;其榜单也是各大文本向量模型用来展示与其他向量模型强弱的一个竞技台。 C-MTEB则是专门针对中文文本向量的评测基准。 MTEB MTEB的目的是为了…

esp32 GDEH0154D67屏幕调试

官方资料 说明手册&#xff1a;GDEH0154D67specf3d5.pdf (e-paper-display.cn) 官网&#xff1a;1.54寸黑白单色电子纸显示屏 200x200分辨率电子墨水屏 GDEH0154D67,黑白电子纸屏,电子墨水屏-大连佳显 (e-paper-display.cn) 驱动代码来源&#xff1a;桌面小屏幕实战课程资料…

面向对象的编程语言是什么意思?——跟老吕学Python编程

面向对象的编程语言是什么意思&#xff1f;——跟老吕学Python编程 面向对象是什么意思&#xff1f;面向对象的定义面向对象的早期发展面向对象的背景1.审视问题域的视角2.抽象级别3.封装体4.可重用性 面向对象的特征面向对象的开发方法面向对象程序设计基本思想实现 面向对象的…

机器学习周报第32周

目录 摘要Abstract一、文献阅读1.论文标题2.论文摘要3.论文背景4.论文方案4.1 多视角自注意力网络4.2 距离感知4.3 方向信息4.4 短语模式 二、self-attention 摘要 本周学习了多视角自注意力网络&#xff0c;在统一的框架下联合学习输入句子的不同语言学方面。具体来说&#x…

Node 旧淘宝源 HTTPS 过期处理

今天拉取老项目更新依赖&#xff0c;出现 urlshttps%3A%2F%2Fregistry.npm.taobao.org%2Fegg-logger%2Fdownload%2Fegg-logger-2.6.1.tgz: certificate has expired 类似报错。即使删除 node_modules 重新安装&#xff0c;问题依然无法解决。 一、问题演示 二、原因分析 1、淘…

子类和父类在同一包中的继承性

同一包中的继承性 继承非private的成员变量&#xff1b; 继承private的方法&#xff1b; 继承的成员变量或方法的访问权限保持不变。

elasticsearch 深度分页查询 Search_after(图文教程)

Search_after使用 一. 简介二. 不带PIT的search_after查询2.1 构造数据2.2 search_after分页查询2.2 问题 三. 带PIT的search_after查询3.1 构建第一次查询条件3.2 进行下一页查询3.3 删除PIT 四.参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注…

【JS】APIs:事件流、事件委托、其他事件、页面尺寸、日期对象与节点操作

1 事件流 捕获阶段&#xff1a;从父到子 冒泡阶段&#xff1a;从子到父 1.1 事件捕获 <body> <div class"fa"><div class"son"></div> </div> <script>const fadocument.querySelector(.fa);const sondocument.qu…

指针----三

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.冒泡排序2、二级指针3.指针数组4.指针数组模拟二级指针5.字符指针变量6.数组指针变量6.1 数组指针变量是什么&#xff1f;2.2 数组指针变量的初始化 前言 下…

bug总结(1)--变量取错

a c t i v i t y [ ′ t a g n a m e ′ ] 应为 activity[tag_name]应为 activity[′tagn​ame′]应为couponActivitList[0][‘name’] .隐藏的bug&#xff0c;在测试中竟然测不出来&#xff0c;而且上线了好久。为啥会出现这种低级错误呢&#xff1f;第一是写的时候不够仔细认…

【Python数据结构与判断2/7】数据和判断小结

目录 序言 print() 变量 赋值 四种数据类型 字符串 格式化输出 四则运算 取整与取模 比较运算 逻辑运算 判断 if语句 if-else语句 if-elif-else语句 Tips 空值、0、非0非空值 实战案例 输入密码 短信模板 总结 序言 今天将对前面学过的内容进行一个复习小结…