全栈:Web 用户登录过程实例与Cookie管理

用户创建与使用cookie全过程

1.用户访问网站

当用户使用浏览器访问一个网站时,浏览器会向服务器发送一个HTTP请求。

2. 服务器响应请求

服务器接收到HTTP请求后,会处理请求并准备响应。如果服务器需要设置Cookie,它会在HTTP响应头中包含一个Set-Cookie指令。

3. 创建Cookie

服务器使用setcookie()函数(在PHP中)或等效的方法来创建Cookie。这个函数允许服务器设置Cookie的名称、值、过期时间、路径、域和其他属性。

PHP示例:

setcookie("user_id", "12345", time() + 3600, "/", "example.com", false, true);

  • "user_id" 是Cookie的名称。
  • "12345" 是Cookie的值。
  • time() + 3600 设置Cookie的过期时间为当前时间加1小时。
  • "/" 指定Cookie的Path属性,意味着Cookie对于example.com的所有页面都是可访问的。
  • "example.com" 指定Cookie的Domain属性,意味着Cookie仅在example.com域下有效。
  • false 表示不使用安全的传输层协议(HTTPS)。
  • true 设置Cookie为HttpOnly,这意味着Cookie不能通过JavaScript访问,增加了安全性。

4. 发送Cookie到浏览器

服务器将带有Set-Cookie指令的HTTP响应发送回浏览器。浏览器解析这些指令,并根据它们创建Cookie。

5. 浏览器存储Cookie

浏览器会将接收到的Cookie存储在内存中(会话Cookie)或磁盘上(持久Cookie)。存储的位置和方式由浏览器的隐私和安全设置决定。

6. 后续请求自动携带Cookie

当用户在同一个域和路径下进行后续请求时,浏览器会自动在HTTP请求头中包含之前存储的Cookie,通过Cookie指令发送回服务器。

示例:

Cookie: user_id=12345; other_cookie=value

7. 服务器接收Cookie

服务器接收到带有Cookie的HTTP请求后,可以从请求头中读取Cookie的值,并使用这些信息来识别用户的状态或偏好。

8. 使用Cookie信息

服务器可以使用Cookie中的信息来个性化用户的体验,例如,通过使用用户的ID来恢复他们的购物车内容,或者根据用户的偏好提供定制化的内容。

9. Cookie的生命周期结束

Cookie的生命周期可以是短暂的(会话Cookie),也可以是持久的(设置了过期时间的Cookie)。

  • 会话Cookie 在用户关闭浏览器时自动删除。
  • 持久Cookie 会在指定的过期时间到达后自动删除,或者用户可以手动清除它们。

10. 删除Cookie

可以通过两种方式删除Cookie:

  • 过期:当Cookie的过期时间到达时,浏览器会自动删除它。
  • 手动:用户可以手动通过浏览器设置删除Cookie,或者服务器可以通过发送一个带有过去过期时间的Set-Cookie指令来指示浏览器删除特定的Cookie。

 

cookie:用户登录实例

登录流程:

  1. 用户输入信息:用户在登录页面输入用户名和密码。

  2. 提交验证:用户提交表单,这些信息以POST请求的形式发送到服务器。

  3. 服务器验证:服务器接收到请求,验证数据库中的用户名和密码是否与用户输入的匹配。

  4. 设置cookie:一旦验证成功,服务器使用setcookie()函数创建一个cookie来标识用户已登录

  5. 重定向:服务器通常会重定向用户到一个受保护的页面或用户的个人主页。

维持登录状态:

  1. 发送cookie:浏览器会在每次请求服务器时自动携带相关的cookie。

  2. 检查cookie:服务器检查请求中是否包含特定的cookie来确定用户是否已登录:

注销流程:

  1. 注销请求:用户点击注销链接,请求服务器结束会话。

  2. 删除cookie:服务器通过设置cookie的过期时间为过去的时间来删除它:

  3. 重定向到登录页面:注销后,通常将用户重定向回登录页面。

前端:进行用户登录,并提交post表单到指定脚本

07.php
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="09.php" method="post" >用户名<input type="text" name="username">邮箱<input type="text" name="email"><input type="submit"></form>
</body>
</html>

后端登录验证,验证用户名密码后,创建cookie存储用户名

09.php
<?phpif(empty($_POST['uname']) || empty($_POST['passwd'])){if($_POST['uname'] == "zhangsan" && $_POST['passwd'] == 123456){setcookie("username",$_POST['uname'],time()+3600);echo '<a href="06.php" target="_blank" >access</a>';}else{echo '<script>alert("Invalid username or password")</script>';}}else{echo '<script>alert("The user name and password are empty")</script>';}?>

 检查用户提交的用户名和密码,如果用户名是"zhangsan"且密码是123456,则会设置一个名为"username"的cookie,并将用户重定向到名为"06.php"的页面。如果用户名或密码不正确,或者两者都为空,会弹出一个警告框提示用户。

  1. 代码检查前端表单,使用empty函数检查$_POST['uname']属性,和$_POST['passwd']属性是否为空,并使用逻辑与进行运算。最后使用逻辑非取反

  2. 如果用户名和密码不为空,脚本继续检查用户名是否是"zhangsan"且密码是否是123456。

  3. 如果用户名和密码都正确,脚本使用setcookie函数设置一个名为"username"的cookie,该cookie的值为用户提交的用户名,并且有效期为1小时(3600秒)。

  4. 然后会输出一个a标签,链接到"06.php"页面的超链接,用户可以通过点击这个链接继续访问。

  5. 如果用户名或密码不正确,脚本会输出一个JavaScript的alert函数,弹出提示框,提示用户“Invalid username or password”。

  6. 如果前端传递表单中,用户名和密码其一,或都为空,脚本会输出一个JavaScript的alert函数,弹出提示框,提示用户“The user name and password are empty”。

测试登录状态

检查cookie中是否有用户登录参数,并且根据检查结果提供不同的响应。

06.php
<?php    header("content-type:text/html;charset=utf8");if(!(empty($_COOKIE['username']))){echo '欢迎用户:' . $_COOKIE['username'];}else{echo "<script >";echo "alert('未登录,即将重定向');";echo "window.location.href='08.html';";echo "</script>";}// echo '<a href="10.php">点击清除登录信息</a>';echo'<form action="10.php" method="get">';echo'<button type="submit">点击清除登录信息</button>';echo'</form>';?>

1.使用empty()函数检查$_COOKIE['username']是否为空。

$_COOKIE是一个超全局变量,它包含了所有由客户端发送到服务器的cookie信息。

如果username cookie不为空,说明用户已经登录。

 

2.如果用户已经登录,输出欢迎信息,并将用户名(存储在username cookie中的值)展示给用户。

如果username cookie为空,表示用户尚未登录。

 

3.在用户未登录的情况下,代码将执行以下操作:

  • 使用<script>标签内联定义一个JavaScript脚本。
  • 使用alert()函数弹出一个警告框,提示用户未登录。
  • 使用window.location.href='08.html';将用户重定向到08.html页面。

 

4.无论用户是否登录,接下来的代码提供了一个表单,其中包含一个按钮。

当用户点击这个按钮时,表单会以GET方法提交并跳转到10.php,用于清除登录信息,例如删除相关的cookie。

 

用户退出登录状态,清除cookie值

10.php
<?phpsetcookie("username",$_COOKIE['username'],time()-3600);header("Location:08.html");
?>

清除cookie,并重定向到前端登录页面: 

  1. setcookie("username", $_COOKIE['username'], time() - 3600);

    • setcookie()函数用于设置cookie。
    • 第一个参数"username"是要设置的cookie的名称。
    • 第二个参数$_COOKIE['username']是从客户端发送到服务器的现有cookie的值。这意味着即使用户之前没有设置username cookie,这段代码也不会产生错误,因为$_COOKIE['username']在没有对应cookie时为null。
    • 第三个参数time() - 3600设置了cookie的过期时间。time()函数返回当前的Unix时间戳,减去3600(一个小时的秒数)意味着cookie会在设置后的一个小时前过期,这实际上会立即删除这个cookie。
  2. header("Location: 08.html");

    • header()函数用于发送原始的HTTP头部到客户端。在这里,它发送的是一个Location头部,这会告诉浏览器服务器希望客户端重定向到另一个URL。
    • "08.html"是服务器上的目标页面的路径,用户将被重定向到这个页面。

setcookie扩展

在PHP中,创建一个同名的cookie并立即设置其过期时间,实际上是一个删除该cookie的技巧。这是因为HTTP协议没有直接提供删除cookie的方法,但你可以通过设置一个过期时间来间接删除它。

创建并删除同名cookie的步骤和原因:

  1. 创建同名cookie:使用setcookie()函数创建一个同名的cookie,意味着你正在创建一个新的cookie来覆盖之前存在的同名cookie。

  2. 设置过期时间:将新cookie的过期时间设置为当前时间减去一个较大的数值(例如3600秒,即1小时)。这样,新cookie的过期时间实际上是在过去,这告诉浏览器该cookie已经不再有效。

  3. 浏览器响应:浏览器接收到这个带有过去过期时间的cookie后,会认为它已经过期,并从用户的系统中删除它。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合RabbitMQ的快速使用教程

目录 一、引入依赖 二、配置rabbitmq的连接信息等 1、生产者配置 2、消费者配置 三、设置消息转换器 四、生产者代码示例 1、配置交换机和队列信息 2、生产消息代码 五、消费者代码示例 1、消费层代码 2、业务层代码 在分布式系统中&#xff0c;消息队列是一种重要…

#职场发展#其他

一闪论文是目前市场上一款非常靠谱的论文写作工具&#xff0c;不仅可以帮助用户快速完成论文撰写&#xff0c;还能对文章进行查重降重&#xff0c;确保内容原创性。从用户的角度来看&#xff0c;一闪论文确实是一个非常方便、实用的工具&#xff0c;能够大大提高写作效率&#…

00Java准备工作

目录 JDK的安装目录 JAVA环境变量的配置 JAVA小知识 JDK的安装目录 目录名称说明bin该路径下存放了JDK的各种工具命令,javac和java就放在这个目录conf该路径下存放了JDK的相关配置文件include该路径下存放了一些平台特定的头文件jmods该路径下存放了JDK的各种模块legal该路…

简单随机数据算法

文章目录 一&#xff0c;需求概述二&#xff0c;实现代码三、测试代码四、测试结果五、源码传送六、效果演示 一&#xff0c;需求概述 系统启动时&#xff0c;读取一组图片数据&#xff0c;通过接口返回给前台&#xff0c;要求&#xff1a; 图片随机相邻图片不重复 二&#…

Java数据结构与算法(散列表)

前言 散列表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。而key的冲突主要通过链表的方式来处理&#xff0c;后期链表过长情况下可以通过红黑树来优化查询效率。 实…

进程互斥经典问题(读写者问题、理发店问题)

目录 读写者问题 问题描述 问题分析 进程互斥问题三部曲 读者写者算法实现 一、找进程——确定进程关系 二、找主营业务 三、找同步约束 a.互斥 b.资源 c.配额 理发店问题 问题描述 问题分析 进程互斥问题三部曲 理发店问题算法实现 一、找进程——确定进程…

SB-OSC,最新的 MySQL Schema 在线变更方案

目前主流的 MySQL 在线变更方案有两个&#xff1a; 基于 trigger 的 pt-online-schema-change基于 binlog 的 gh-ost 上周 Sendbird 刚开源了他们的 MySQL Schema 在线变更方案 SB-OSC: Sendbird Online Schema Change。 GitHub 上刚刚 25 颗星星&#xff0c;绝对新鲜出炉。 …

Qt Creator(2)【如何在Qt Creator中创建新工程】

阅读导航 引言一、Qt Creator开始界面介绍二、如何在Qt Creator中创建新工程1. 新建项目2. 选择项目模板3. 选择项目路径4. 选择构建系统5. 填写类信息设置界面6. 选择语言和翻译文件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 三、认识Qt Creator项目内容界面1. 基本界面2.…

React Native 之 处理触摸事件(八)

React Native 提供了可以处理常见触摸手势&#xff08;例如点击或滑动&#xff09;的组件&#xff0c; 以及可用于识别更复杂的手势的完整的手势响应系统。 Button是一个简单的跨平台的按钮组件。下面是一个最简示例&#xff1a; <ButtononPress{() > {Alert.alert(你点…

go语言初识别(五)

本博客内容涉及到&#xff1a;切片 切片 1. 切片的概念 首先先对数组进行一下回顾&#xff1a; 数组定义完&#xff0c;长度是固定的&#xff0c;例如&#xff1a; var num [5]int [5]int{1,2,3,4,5}定义的num数组长度是5&#xff0c;表示只能存储5个整形数字&#xff0c…

检索模型预训练方法:RetroMAE

论文title&#xff1a;https://arxiv.org/pdf/2205.12035RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder 论文链接&#xff1a;https://arxiv.org/pdf/2205.12035 摘要 1.一种新的MAE工作流&#xff0c;编码器和解器输入进行了不同的掩…

华为OD机试【计算最接近的数】(java)(100分)

1、题目描述 给定一个数组X和正整数K&#xff0c;请找出使表达式X[i] - X[i1] … - X[i K 1]&#xff0c;结果最接近于数组中位数的下标i&#xff0c;如果有多个i满足条件&#xff0c;请返回最大的i。 其中&#xff0c;数组中位数&#xff1a;长度为N的数组&#xff0c;按照元…

软件性能测试有哪些测试类型和方法?

软件性能测试是一种通过模拟真实用户使用情况&#xff0c;评估软件系统在各种压力和负载下的表现的测试方法。在今天这个讲究效率的时代&#xff0c;软件性能测试是不可或缺的一环。它能帮助开发人员和企业发现潜在的性能问题&#xff0c;提前优化改进&#xff0c;保证软件系统…

Flutter 中的 SizeChangedLayoutNotifier 小部件:全面指南

Flutter 中的 SizeChangedLayoutNotifier 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;SizeChangedLayoutNotifier 是一种特殊的小部件&#xff0c;它用于监听其子组件尺寸的变化。当子组件的大小发生变化时&#xff0c;SizeChangedLayoutNotifier 可以通知其他组件…

动态内存管理—C语言通讯录

目录 一&#xff0c;动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二&#xff0c;通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一&#xff0c;动态内存函数的介绍 1.1 malloc和free void* malloc (…

回文链表(快慢指针解法之在推进过程中反转)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;抱怨深处黑暗&#xff0c;不如提灯前行…

进程间通信IPC机制

进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。IPC机制有多种方式&#xff0c;每种方式都有其特定的工作原理、应用场景以及优缺点。以下是对几种主要IPC方式的详细解释&#xff1a; 管道&#xff08;Pipe&a…

数据结构算法题day04

数据结构算法题day04 题目分析算法思想代码完整运行代码如下&#xff1a; 题目 对长度为n的顺序表L&#xff0c;编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法 该算法删除线性表中所有值为X的数据元素。分析 O(n) -> 扫描一次顺序表 O(1) -> 申请常数个辅助空间 1…

代码随想录算法训练营day14|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

二叉树的递归遍历 首先需要明确的一点是&#xff0c;前序中序和后序在二叉树的递归遍历中的区别仅在于递归函数中操作的顺序&#xff0c;前序是在遍历一个节点的左右子树前进行操作&#xff0c;中序是在遍历一个节点的左子树后进行操作再遍历右子树&#xff0c;而后序是在遍历…

C++算术运算和自增自减运算

一 引言 表示运算的符号称为运算符。 算术运算&#xff1b; 比较运算&#xff1b; 逻辑运算&#xff1b; 位运算&#xff1b; 1 算术运算 算术运算包括加、减、乘、除、乘方、指数、对数、三角函数、求余函数&#xff0c;这些都是算术运算。 C中用、-、*、/、%分别表示加、减…