广告
返回顶部
首页 > 资讯 > 服务器 >Cookie与Session是如何联动的?
  • 517
分享到

Cookie与Session是如何联动的?

servletjava服务器CookieSession 2023-09-01 12:09:23 517人浏览 独家记忆
摘要

系列文章目录 HTTP协议中的“报头”(header)和 “正文“ (body)详解_crazy_xieyi的博客-CSDN博客_http头和body Fiddler抓包:下载、安装及使用_crazy_xieyi的博客-CSDN博客 文章

系列文章目录

HTTP协议中的“报头”(header)和 “正文“ (body)详解_crazy_xieyi的博客-CSDN博客_http头和body

Fiddler抓包:下载、安装及使用_crazy_xieyi的博客-CSDN博客


文章目录

  • 一、Cookie是什么?
  • 二、Session是什么?
  • 三、Cookie与Session在网页登录中的典型联动流程
  • 四、Cookie与Session的区别
  • 五、关于Cookie与Session联动的案例分析(实现用户登录)

一、Cookie是什么?

Cookie是属于报头(header)里面的,详情请参考博客:Http协议中的“报头”(header)和 “正文“ (body)详解_crazy_xieyi的博客-CSDN博客_http头和body请求“报头”(header)、请求 “正文“ (body)以及响应 “报头“ (header)、响应 “正文“ (body)详解https://blog.csdn.net/crazy_xieyi/article/details/126745105

Cookie是HTTP协议中的一个字段,同时也是浏览器在客户端这边保存数据的一种比较古老的方式。Cookie是由服务器产生的,通过HTTP响应的Set-Cookie字段来进行设置,并返回给浏览器。Cookie是在浏览器这边进行储存的,浏览器会根据域名/地址来分别储存Cookie。在浏览器的下次请求中Cookie会被自动添加到请求中,发送给服务器。其中Cookie是以键值对结构的字符串来进行储存的,这里的键值对都是程序员自定义的。        

 

二、Session是什么?

Session叫做“会话”。因为HTTP协议本身是无状态的,如果对服务器进行两次请求,对于服务器来说是感知不到这两次请求的关联关系的。在实际开发中,要求服务器是需要有状态的,比如:当用户完成登陆之后,后续再访问这个网站的时候,服务器就能知道这个用户的身份信息了(前提是浏览器没有清除缓存)。Session是在服务器端进行储存的,Session类似一个hash表,key就是sessionId。value就是程序员自定义的数据(用户的身份信息.......)。

三、Cookie与Session在网页登录中的典型联动流程

Cookie与Session之间是需要相互配合的。相互配合流程如下:

d0ae3d8b33b44533b254454217cf0e82.png

 在这个场景中,服务器返回的set-cookie里面不一定要放sessionId,其实也可以直接把用户信息序列化通过Set-Cookie返回给浏览器。只是Session是一种常见的做法,这样的做法的好处就是方便实现“注销操作”,在服务器这边直接就把session中对应的键值对删了就行。同时,通过session返回也是可以保护用户的隐私的。

四、Cookie与Session的区别

Cookie 是客户端的机制,Session 是服务器端的机制。 Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合。完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是sessionId,Session 中的 sessionId 也不需要非得通过 Cookie / Set-Cookie 传递。   HttpServletRequest 类中的相关方法
方法描述
HttpSession getSession() 在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null
Cookie[] getCookies() 返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把Cookie 中的格式解析成键值对
HttpServletResponse 类中的相关方法
方法描述
void addCookie(Cookie cookie) 把指定的 cookie 添加到响应中
HttpSession 类中的相关方法 一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息:
方法描述
Object getAttribute(Stringname) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null
void setAttribute(Stringname, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话
boolean isNew() 判定当前是否是新创建出的会话
Cookie 类中的相关方法 每个 Cookie 对象就是一个键值对:
方法描述
String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是 Set-Cooke 字段设置给浏览器的)
String getValue() 该方法获取与 cookie 关联的值
void setValue(String newValue) 该方法设置与 cookie 关联的值
HTTP 的 Cooke 字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie 对象。通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对。通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对。

五、关于Cookie与Session联动的案例分析(实现用户登录)

实现简单的用户登陆逻辑,这个代码中主要是通过 HttpSession 类完成. 并不需要我们手动操作 Cookie 对象。 4e2f4cb0884f4b758af70b854f61b545.png

 

前端代码:
    
用户名:
密码:

服务器代码-IndexServlet

@WEBServlet("/index")public class IndexServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //根据当前用户请求中的sesionId,获取到用户信息,并显示到页面上        resp.setContentType("text/html;charset=utf-8");        //1.判断当前用户是否已经登录(请求中有没有sessionId,以及sessionId是否合法)        //如果会话不存在,此处在这里就不能创建了,只能查询,不是登录        HttpSession httpSession = req.getSession(false);        if (httpSession == null){            //没有会话,说明当前用户没有登录,就重定向到登录页面            resp.sendRedirect("login.html");            return;        }        //2.如果用户已经登录,就可以从HttpSession中拿到用户信息了        String username = (String)httpSession.getAttribute("username");        Integer loginCount = (Integer) httpSession.getAttribute("loginCount");        loginCount = loginCount + 1;        httpSession.setAttribute("loginCount",loginCount);        //3.返回一个html页面        StringBuilder html = new StringBuilder();        html.append("
用户:" + username + "
"); html.append("
访问次数:" + loginCount + "
"); resp.getWriter().write(html.toString()); }}

服务器代码-LoginServlet

@WebServlet("/login")public class LoginServlet extends HttpServlet{    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.setContentType("text/html;charset=utf-8");        //1.先从请求的body中读取用户名和密码        String username = req.getParameter("username");        String passWord = req.getParameter("password");        //2.判定用户名和密码是否正确(这里测试就直接使用固定用户名和密码了        if (!"zhangsan".equals(username) || !"1234".equals(password)){            resp.getWriter().write("用户名或密码不正确!");            return;        }        System.out.println("登录成功!");        //3.登录成功就创建会话(不存在会话就会创建        //会话是根据请求中的sessionId来查的,sessionId在Cookie中        //但是此时是首次登录,此时请求中是没有Cookie的,因为Cookie是服务器返回的        //此时就会触发“找不到就创建”这样的流程        //同时这里进行的操作是:先创建出一个HttpSession对象(作为value),然后会自动生成一个        //随机的字符串,作为sessionId(作为Key),然后自动把key和value插入到hash表中        //同时把这个生成的sessionId 通过 Set-Cookie 字段返回        HttpSession httpSession = req.getSession(true);        //此时可以存入自定义的信息(比如用户身份信息......        httpSession.setAttribute("username","zhangsan");        httpSession.setAttribute("loginCount",0);  //记录访问次数        //4.让页面跳转到主页,使用重定向即可        resp.sendRedirect("index");    }}

 

其中交互过程如下:(以下会用到Fiddler进行抓包分析Fiddler抓包:下载、安装及使用_crazy_xieyi的博客-CSDN博客我们在学习HTTP协议的时候就可以利用Fiddler这个抓包工具。因为HTTP是一个文本格式的协议,我们可以通过Fiddler抓包, 来分析HTTP请求/响应的细节。https://blog.csdn.net/crazy_xieyi/article/details/126709702

客户端给服务器的第一次交互,是一个登录请求。 

请求:

ec737cf538d648ef93001706c4ce4f20.png

这里登录成功后,就创建了一个session 对象,同时生成了一个sessionId。 

57bb4ec5ab8244eca10649a0e037fa73.png

 响应:

8efbd15ea9b4483caae2f2e6a21c9f87.png

 响应里面就可以看到Set-Cookie这个字段,jsESSIONID=E682780C1B1D7FA633FB998DE0E0E038就是Servlet生成的sessionId,key就是JSESSIONID,value就是后面一串十六进制的数字。

然后正是因为这个Location: index,因为这个重定向,就触发了浏览器与服务器的第二次交互。

第二次交互,是一个访问主页的请求。

请求:

62dbb1b3853a41c892476bbc3058d189.png

这里我们可以看到,在第二次的请求中就自动带了Cookie,而且你会发现此时第二次的请求与第一次的响应中的Cookie值是一样的,然后服务器就会根据Cookie里面的sessionId去查找匹配,然后返回对应的页面给浏览器。

响应: 

95a10d3e62564e24aa0ade30263ce3f4.png

 

 

 

 

来源地址:https://blog.csdn.net/crazy_xieyi/article/details/127096862

--结束END--

本文标题: Cookie与Session是如何联动的?

本文链接: https://www.lsjlt.com/news/388417.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Cookie与Session是如何联动的?
    系列文章目录 HTTP协议中的“报头”(header)和 “正文“ (body)详解_crazy_xieyi的博客-CSDN博客_http头和body Fiddler抓包:下载、安装及使用_crazy_xieyi的博客-CSDN博客 文章...
    99+
    2023-09-01
    servlet java 服务器 Cookie Session
  • Session和Cookie的区别与联系是什么
    Session和Cookie是两种不同的机制,用于在Web应用中保存用户状态信息。区别:1. 存储位置:Cookie存储在客户端(浏...
    99+
    2023-08-15
    Session Cookie
  • 怎样分析cookie与SESSION的区别和联系
    怎样分析cookie与SESSION的区别和联系,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中...
    99+
    2023-06-03
  • Session与cookie的区别是什么
    Session与cookie的区别:Session是存储在服务器端的,cookie是存储在客户端的。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。Session里的信息是通过存放在...
    99+
    2022-10-04
  • 如何理解Flask中的Cookie与session
    如何理解Flask中的Cookie与session,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Cookie的使用1、什么是Cookie我们都知道,HTTP...
    99+
    2023-06-21
  • php中cookie与session的区别是什么
    本篇内容主要讲解“php中cookie与session的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中cookie与session的区别是什么”吧!本教程操作环境:window...
    99+
    2023-06-21
  • Java的Cookie、Session及kaptcha验证码如何使用
    这篇文章主要讲解了“Java的Cookie、Session及kaptcha验证码如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的Cookie、Session及kaptcha验...
    99+
    2023-07-02
  • vue+iview的菜单与页签如何联动
    这篇文章主要介绍了vue+iview的菜单与页签如何联动的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue+iview的菜单与页签如何联动文章都会有所收获,下面我们一起来看看吧。vue+iview菜单与页签联...
    99+
    2023-06-20
  • Django cookie和session的应用场景及如何使用
    目录为什么需要使用cookie和ses sion?什么是cookie,cookie的应用场景及缺点Django中如何使用cookies什么是session及session的...
    99+
    2022-11-12
  • 如何实时监控input框与下拉框联动
    这篇文章主要介绍了如何实时监控input框与下拉框联动,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如图:html代码<tr> ...
    99+
    2022-10-19
  • vue中elementUI如何使用tabs与导航栏联动
    这篇文章主要介绍了vue中elementUI如何使用tabs与导航栏联动,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。不使用tabs标签页时...
    99+
    2022-10-19
  • NumPy是什么?它如何与PHP数据类型相关联?
    NumPy是Python中最受欢迎的科学计算库之一。它提供了高效的多维数组操作,以及用于数学、科学、工程和数据科学的各种函数。与Python的标准库相比,NumPy提供了更好的性能和更多的功能。 但是,PHP是一种完全不同的编程语言,它的...
    99+
    2023-06-29
    数据类型 实时 numy
  • PHP中的数组如何与外壳相关联?
    PHP是一种非常流行的编程语言,被广泛应用于Web开发。在PHP中,数组是一种非常常见的数据类型,用于存储一组相关的数据。在本文中,我们将探讨PHP中的数组如何与外壳相关联。 在PHP中,数组可以与外壳相关联,这意味着我们可以使用一个字符串...
    99+
    2023-11-02
    load shell 数组
  • C/C++ Qt数据库与TableView实现多组件联动的方法是什么
    这篇文章主要讲解了“C/C++ Qt数据库与TableView实现多组件联动的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C/C++ Qt数据库与TableV...
    99+
    2023-06-21
  • 如何深入探究cookie技术在J2ME平台的应用与实现
    这篇文章给大家介绍如何深入探究cookie技术在J2ME平台的应用与实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。向大家简单介绍一下cookie技术在J2ME平台的应用与实现,首先...
    99+
    2022-10-19
  • 如何分析C++数组和指针的区别与联系
    这期内容当中小编将会给大家带来有关如何分析C++数组和指针的区别与联系,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言:一直以来,有很多地方在说到数组和指针时都会说数据就是指针,这种观点也被越来越多的人...
    99+
    2023-06-26
  • jquery如何实现省市区联动的选择功能
    本篇内容主要讲解“jquery如何实现省市区联动的选择功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery如何实现省市区联动的选择功能”吧!一、需求分析需要三个下拉框,分别代表省、市、...
    99+
    2023-07-06
  • 如何实现参数和报表间的联动效果
    在交互分析中,报表经常需要根据参数进行实时变化。也就是“参数联动”效果,下面就通过一个例子说明润乾报表是如何实现这种需求的。页面的左侧为参数输入区域,右侧的数据报表需要根据参数实时查询结果,效果如下图:实现步骤:1 准备报表连接默认的 de...
    99+
    2023-06-02
  • windows该文件没有与之关联的程序如何解决
    这篇文章主要介绍“windows该文件没有与之关联的程序如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“windows该文件没有与之关联的程序如何解决”文章能帮助大家解决问题。解决方法:首先找...
    99+
    2023-07-02
  • Android中是如何获取手机联系人的
    这篇文章给大家介绍Android中是如何获取手机联系人的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android 获取系统联系人信息的实例一、获取手机联系人姓名及手机号//跳转到系统联系人应用 Inten...
    99+
    2023-05-30
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作