位置: IT常识 - 正文

Cookie和Session详解(cookie与session的作用和原理)

发布时间:2024-01-17
Cookie和Session详解

目录

前言:

Session详解

Cookie和Session区别和关联

服务器组织会话的方式

使用Tomcat实现登录成功跳转到欢迎页面

登录前端页面

登录成功后端服务器

重定向到欢迎页面

抓包分析交互过程

 小结:


前言:

推荐整理分享Cookie和Session详解(cookie与session的作用和原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cookie和session的用法,cookie与session的作用,cookie 和session,cookie与sessionid,cookie和session的用法,cookie 和session,cookie与session的作用和原理,cookie与sessionid,内容如对您有帮助,希望把文章链接给更多的朋友!

    Cookie之前博客有介绍过,就是服务器在用户这边搞的一个持久化存储机制。通过服务器这边set-cookie进行设置,用户发起请求通过cookie字段将cookie中的内容发送到服务器,服务器就知道客户端这边处于一个什么样的状态。

    Session是搭配Cookie使用的(也可以不搭配)。对于一个登录需求来说,通过用户的SessionId(存储在Cookie中),服务器这边就可以判断用户是否处于一个登录状态。

Session详解

注意:

    服务器不知道我的身份信息。针对登陆操作,淘宝会查询数据库,验证用户名和密码是否正确,如果正确则登录成功,淘宝会把当前的身份信息在内存中存一份。

    同时给这个用户分配一个表示身份信息的序号,整数或者字符串,具有唯一性(sessionId)。服务器使用像hsah表这样的结构,把序号作为key,身份信息作为val,存储起来(这些键值对称为session)。

    服务器通过Set-Cookie将SessionId保存到用户本地。后续请求中,服务器收到Cookie中的身份序号(SessionId),就会查询上述的hash表,判断用户是谁(避免重复输入账号密码),如果没查到,则需要用户重新登录。

Cookie和Session区别和关联

关联:在网站登录功能中搭配使用。

区别:

    1)Cookie是客户端的存储机制,Session是服务器的存储机制。

    2)Cookie里面可以存各种键值对(还可以存别的),Session则专门用来保存用户信息。

    3)Cookie完全可以单独使用,不搭配Session(实现非登录的场景)。Session也可以不搭配Cookie(手机app登录服务器,没有cookie概念,但存在Session,Cookie和浏览器强相关)。

    4)Cookie是Http协议中的一个部分。Session则可以和http无关。

服务器组织会话的方式Cookie和Session详解(cookie与session的作用和原理)

注意:

    每一个会话是一个键值对,对应到一个客户端。服务器这里可以对应多个客户端,也就可以保存多组会话。

    每个会话对象HttpSession里,也是以键值对方式保存的。存一些用户信息,这里面内容都是自定义的。Java中通过,setAttribute(),getAttribute()存取键值对。用来设置HttpSession对象里的一些内容。

使用Tomcat实现登录成功跳转到欢迎页面登录前端页面

    使用from表单构造post请求,将数据通过body传输到后端。

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login</title></head><body> <form action="login" method="post"> <input type="text" name="username"> <br> <input type="password" name="password"> <br> <input type="submit" value="提交"> </form></body></html>登录成功后端服务器

    前端发起post请求,后端Tomcat调用doPost()方法。判断登录,登录成功则创建会话Session。将用户名设置到HttpSession对象中,然后重定向到欢迎页面。

    创建会话Session,每个客户端都会有一个这样的会话,服务器就使用像hash表这样的结构组织这些会话(key:SessionId   val:HttpSession)。

    getSession(true)判断当前请求是否已经有对应的会话(拿着cookie中的sessionId查一下hash表)。如果没有则创建新会话,插入hah表,如果有则返回对应的HttpSession对象。

    getSession(false)获取SessionId对应的HttpSession对象。同样查询hash表,如果查到了则返回对应的HttpSession对象,如果没有则返回null。

    创建过程:1)构造HttpSession对象。 2)构造一个唯一SessionId。 3)把这个键值对插入hsah表。 4)把sessionId设置到响应报文Set-Cookie字段中。

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 { String userName = req.getParameter("username"); String password = req.getParameter("password"); //判断登录 if(!userName.equals("zhansan") && !userName.equals("lisi")) { System.out.println("登录失败,用户名错误"); resp.sendRedirect("login.html"); return; } if(!password.equals("123")) { System.out.println("密码错误"); resp.sendRedirect("login.html"); return; } //登录成功 //创建会话 //所谓会话是一个键值对,key是sessionId,value是HttpSession对象 //每个客户端登录都会有一个这样的会话(键值对),服务器需要管理多个会话,搞个hash表存储 //getSession(true)判断当前请求是否已经有对应的会话了(拿着cookie中的sessionId查一下hash表) //如果SessionId不存在,就创建新会话,插入hash表,如果查到了就返回对应会话 //创建过程:1)构造HttpSession对象 2)构造一个唯一sessionId 3)把这个键值对插入hsah表 4)把sessionId设置到响应报文Set-Cookie字段中 HttpSession session = req.getSession(true); //HttpSession对象也是一个键值对 //setAttribute(),getAttribute()存取键值对 //把当前用户名保存到会话中 session.setAttribute("username", userName); //重定向到主页 resp.sendRedirect("index"); }}重定向到欢迎页面

    先判断用户是否登录,如果没有登录则重定向到登录页面。登录成功后构造欢迎页面,将用户名显示到页面中。只要登录成功后续请求多次服务器,Cookie字段都会包含SessionId。

    由于这个页面是重定向的,浏览器会发起get请求,这里就需要重写doGet方法。

    这里需要先获得用户的HttpSession对象,通过getSession(false)获取SessionId对应的HttpSession对象。如果返回值为null则用户没登录,否则登录成功构造欢迎页面。

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 { //通过重定向,浏览器发送get请求 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //先判断用户是否登录,如果没登陆重定向到登录页面 //已经登录,根据会话中的用户名,显示到页面中 //这个操作不会触发会话的创建,根据sessionId查找HttpSession对象(根据key查找value) HttpSession session = req.getSession(false); if(session == null) { System.out.println("用户未登录"); resp.sendRedirect("login.html"); return; } //登录成功 String userName = (String) session.getAttribute("username"); //构造页面 resp.setContentType("text/html; charset=utf8"); resp.getWriter().write("欢迎" + userName + "回来"); //只要登录成功,后续请求都会带上刚才这个cookie(包含sessionId) }}抓包分析交互过程

 小结:

    这里的代码需要理清每次请求和响应的具体逻辑。根据这些需求约定好前后端交互接口,代码实现需要严格按照约定来实现。

本文链接地址:https://www.jiuchutong.com/zhishi/299283.html 转载请保留说明!

上一篇:人工智能学习——模糊控制(学人工智能哪家机构比较好)

下一篇:软考-软件设计师 知识点整理(一篇就过了 建议收藏)(软考软件设计师考试时间)

  • jquery ajax请求

    jquery ajax请求

  • steam怎么从香港改回大陆(steam怎么从香港改回国区)

    steam怎么从香港改回大陆(steam怎么从香港改回国区)

  • 超过五分钟的视频如何发给微信好友(超过五分钟的视频怎么剪短)

    超过五分钟的视频如何发给微信好友(超过五分钟的视频怎么剪短)

  • 抖音评论功能已封禁怎么办(抖音评论功能已封禁怎么恢复)

    抖音评论功能已封禁怎么办(抖音评论功能已封禁怎么恢复)

  • 微信提示音怎么修改(微信提示音怎么设置)

    微信提示音怎么修改(微信提示音怎么设置)

  • 滴滴审核头像审核多久(滴滴头像审核中能跑滴滴吗)

    滴滴审核头像审核多久(滴滴头像审核中能跑滴滴吗)

  • 手机身份验证的答案忘记了怎么办(手机身份验证的答案是什么)

    手机身份验证的答案忘记了怎么办(手机身份验证的答案是什么)

  • mwh是什么单位(mwh是什么单位换算毫安)

    mwh是什么单位(mwh是什么单位换算毫安)

  • 抖音有多少人在玩(抖音有多少人在洗黑钱)

    抖音有多少人在玩(抖音有多少人在洗黑钱)

  • 微信建群会提醒对方吗(建群会有提示吗)

    微信建群会提醒对方吗(建群会有提示吗)

  • 淘宝聊天记录保存多久(淘宝聊天记录保存)

    淘宝聊天记录保存多久(淘宝聊天记录保存)

  • 华为手机音乐怎么关不了了(华为手机音乐怎么定时关闭)

    华为手机音乐怎么关不了了(华为手机音乐怎么定时关闭)

  • qq验证粉是什么(qq验证粉引流技术有人叫吗)

    qq验证粉是什么(qq验证粉引流技术有人叫吗)

  • 苹果手机无法关机怎么办(苹果手机无法关机怎么办,按钮也没用)

    苹果手机无法关机怎么办(苹果手机无法关机怎么办,按钮也没用)

  • 华为mate30pro看视频模糊

    华为mate30pro看视频模糊

  • 笔记本的typec接口有什么用(笔记本的typec接口转dp)

    笔记本的typec接口有什么用(笔记本的typec接口转dp)

  • 微信转账助手怎么关闭权限(微信转账助手怎么开通商家小程序)

    微信转账助手怎么关闭权限(微信转账助手怎么开通商家小程序)

  • 苹果耳机连安卓声音小(苹果耳机连安卓手机怎么操作)

    苹果耳机连安卓声音小(苹果耳机连安卓手机怎么操作)

  • 苹果手机微信发语音没声音怎么回事(苹果手机微信发的视频打不开)

    苹果手机微信发语音没声音怎么回事(苹果手机微信发的视频打不开)

  • 网站和网页的联系(网页和网站是怎么连接起来的)

    网站和网页的联系(网页和网站是怎么连接起来的)

  • 苹果8p内存分别是多少(iphone8p内存大小)

    苹果8p内存分别是多少(iphone8p内存大小)

  • word怎么设置角标(word怎么设置)

    word怎么设置角标(word怎么设置)

  • 手机qq怎样分组(手机qq怎样分组管理好友)

    手机qq怎样分组(手机qq怎样分组管理好友)

  • 抖音官方认证审核要多久(抖音申请官方认证有什么好处)

    抖音官方认证审核要多久(抖音申请官方认证有什么好处)

  • qq如何查询被特别关心(怎么查自己qq被别人设置成特别关心)

    qq如何查询被特别关心(怎么查自己qq被别人设置成特别关心)

  • vivoiqoo有没有红外线遥控(iqoo手机有红外线吗)

    vivoiqoo有没有红外线遥控(iqoo手机有红外线吗)

  • windows kits能不能删(windows kits下载)

    windows kits能不能删(windows kits下载)

  • 计算机网络分为(计算机网络分为哪三种)

    计算机网络分为(计算机网络分为哪三种)

  • ps4怎么连接笔记本(ps4连接笔记本)

    ps4怎么连接笔记本(ps4连接笔记本)

  • 京东在哪里改收货地址(京东如何更改收货人)

    京东在哪里改收货地址(京东如何更改收货人)

  • excel照相机怎么用(excell照相机功能)

    excel照相机怎么用(excell照相机功能)

  • 支付客户劳务费怎么操作
  • 个税申报的收入是应发工资还是实发工资
  • 工人工伤误工费赔偿多少一天
  • 2019年工会经费新规定
  • 行政单位会议纪要范文3篇
  • 人力资源外包服务增值税税率
  • 印花税缴款了发现报错了怎么办?
  • 旅游业差额开票的票据可以累计一季度吗
  • 报销个人费用如何定性
  • 没有房产证应该找谁
  • 含税金是什么意思
  • 公司为什么要成立工会委员会
  • 新个税法规定的专项扣除包括住房公积金
  • 红字专用发票信息表需要盖章吗
  • 法人给公司基本户打款
  • 非全日制员工个税扣除标准
  • 母子公司合并报表什么时候做
  • 预估成本费用会计科目
  • 无租使用房产如何征收企业所得税
  • linux系统怎么关闭端口
  • deepin启动延时
  • 职工福利费算职工薪酬吗
  • 跨月的成本费用如何,调整
  • cpu调度schedutil好吗
  • 什么是应交税费科目
  • 教程图怎么做
  • linux如何管理进程
  • 安置残疾人就业单位城镇土地使用税
  • win10怎么投影到手机
  • 现金收入如何做账务处理
  • 发财树的养殖方法和浇水视频
  • yolov5讲解
  • 银行进账单和现金缴款单的区别
  • 来料加工的账务处理
  • 傅里叶变换的过程
  • php use of undefined constant
  • 办理车辆购置税流程
  • 企业印花税怎么入账
  • 电影院属于什么经济类型
  • mysql 5.5 5.6 5.7
  • 固定资产盘盈为什么计入盈余公积
  • 企业管理费用科目期末一般是
  • 如何让主营业务成本增加
  • 企业所得税征前还是征后
  • 物业费没收到可以确认收入吗
  • 应付利息核算的会计分录
  • 车子报废车子怎么处理
  • winxp cmd
  • mysql集群原理详解
  • win8更新win8.1
  • Ubuntu Kylin 14.10默认的屏幕分辨率怎么更改?
  • mac怎么打开mac系统
  • ios自定义应用图标
  • centos安装软件教程
  • openeuler操作系统安装方法
  • win10怎么关闭windowsdefender
  • win8系统优化
  • win8无线连接不可用怎么办
  • 升级win8系统
  • win8怎么更新到win8.1
  • dos 批处理
  • glClearBufferSubData
  • 日历控件默认日期
  • android图形
  • node.js中用什么方法处理get、post请求的参数
  • mkdirs linux
  • python制作简单图形
  • 一个简单的网页
  • jquery事件处理有哪些
  • jquery 遍历
  • 周炜老婆是干什么的
  • 广东etc政策
  • 个人所得税自行纳税申报表(A表)
  • 农村报账员的基本职责
  • 如何查询车辆购置税完税证明
  • 外资企业怎样
  • 甘肃省张掖市国家储备林
  • 武汉市房产证契税 2023
  • 尤溪特产春节礼品
  • 西安个人完税证明怎么开
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号