全栈:session用户会话信息,用户浏览记录实例
PHP中的session
是一种存储机制,它允许您存储和跟踪用户在访问Web应用程序时的信息。会话通常用于存储用户特定的数据,如用户ID、购物车内容、用户偏好设置等,这些数据需要在多个页面请求之间保持不变。
session详解
1. 会话是如何工作的
会话通过唯一的会话ID来标识每个用户。这个会话ID可以存储在多种地方:
- 默认情况下,它存储在cookie中。
- 也可以存储在服务器的端或URL中。
当用户与Web应用程序交互时,服务器使用这个会话ID来检索和更新存储在服务器端的会话数据。
2. 开启会话
要使用会话,必须首先调用session_start()
函数。这个函数初始化会话注册过程,创建会话ID,并存储在cookie中。
session_start();
3. 使用$_SESSION
超全局变量
$_SESSION
是一个超全局变量,它包含了会话存储的数据。可以通过它来设置、读取或删除会话变量。
// 设置会话变量
$_SESSION['username'] = 'JohnDoe';
// 读取会话变量
echo $_SESSION['username'];
// 删除会话变量
unset($_SESSION['username']);
4.会话配置
在调用session_start()
之前,可以使用各种函数来配置会话,例如:
session_name()
:设置会话名称,这是会话ID存储在cookie中的名称。session_module_name()
:指定使用的会话模块。session_save_path()
:设置会话数据的保存路径。
5. 会话ID管理
- 可以通过
session_id()
获取当前会话ID。 - 使用
session_regenerate_id()
可以重新生成一个新的会话ID。
6. 会话结束
当用户完成与Web应用程序的交互时,可能希望结束会话。这可以通过调用session_destroy()
函数实现,它将销毁所有的会话数据。
session_destroy();
实例代码内函数简介
session_start()
: 启动一个新的或恢复一个现有的会话,是使用会话变量的前提。
$_SESSION
: 超全局数组,用于存储用户会话数据。如$_SESSION['username']
用于存储用户名。
empty()
: 检查一个变量是否为空。如果变量未设置,或者其值等同于FALSE
,则返回TRUE
。
isset()
: 判断变量是否已经设置且不为NULL
。变量存在且有值的情况下返回true,反之(空值,null)为false
basename(__FILE__)
: 返回路径中的文件名部分,__FILE__
是一个魔术常量,代表当前脚本的完整路径和文件名。
array_unshift()
: 在数组的开头插入一个或多个元素。
foreach
: 遍历数组的每个元素,并执行代码块。
header()
: 发送原生的HTTP头信息。常用于重定向(header("Location: ...")
)、设置内容类型(header("Content-Type: ...")
)等。
用户浏览记录实例
1.编写前端html代码,用于post传递用户名等信息
html源码:08.html
<!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">
name:<input type="text" name="uname">
password: <input type="password" name="passwd">
<input type="submit" value="log in">
</form>
</body>
</html>
-
<form>
标签定义了一个表单,用户可以在这个表单中输入数据。action="09.php"
指定了当用户提交表单时,表单数据将被发送到服务器上的 "09.php" 文件进行处理。method="post"
指定了数据发送的方式为POST方法,这通常用于提交敏感信息,如密码,因为它不会在URL中显示数据。 -
name:<input type="text" name="uname">
创建了一个文本输入框,用户可以在此输入用户名。name="uname"
定义了输入框的名称,这个名称在后端处理表单数据时用来识别这个字段的值。 -
password: <input type="password" name="passwd">
类似地,创建了一个密码输入框,用户输入的内容会被隐藏显示为星号或圆点,以保护密码不被旁人窥视。name="passwd"
是该输入框的名称,同样用于后端数据处理。 -
<input type="submit" value="log in">
创建了一个提交按钮,用户点击此按钮后,表单数据就会被提交。value="log in"
定义了按钮上显示的文字为 "log in"。
2.后端编写用户名,密码登录验证
php源码:09.php
<?php
session_start();
if(!(empty($_POST['uname']) && empty($_POST['passwd']))){
if($_POST['uname'] == "zhangsan" && $_POST['passwd'] == 123456){
$_SESSION['username'] = $_POST['uname'];
if (!(isset($_SESSION['history']))){
$_SESSION['history'] = [];
array_unshift($_SESSION['history'],basename(__FILE__));
}
echo '<a href="06.php" target="_blank" >access:log in</a>';
//var_dump($_SESSION);
}else{
echo '<script>alert("Invalid username or password")</script>';
}
}else{
echo '<script>alert("The user name and password are empty")</script>';
}
?>
-
session_start();
启动了会话管理,允许在多个页面间传递数据,比如用户的登录状态。 -
if(!(empty($_POST['uname']) && empty($_POST['passwd']))){}
检查是否同时提交了用户名(uname
)和密码(passwd
),如果两者都不为空,则继续执行内部代码。 -
接下来的条件
if($_POST['uname'] == "zhangsan" && $_POST['passwd'] == 123456){}
验证用户输入的用户名和密码是否与预设的凭证匹配(这里仅为示例,实际应用中不应硬编码凭证)。如果是,执行以下操作:-
$_SESSION['username'] = $_POST['uname'];
将用户名存储在会话变量中,表示用户已成功登录。 -
代码检查是否存在一个名为
'history'
的会话变量。如果不存在,初始化为空数组,并将当前脚本文件名(通过basename(__FILE__)
获得)添加到数组的开头作为用户登录的历史记录。
-
-
如果登录成功,页面会显示一个链接指向"06.php"页面,用户可以点击访问。否则,通过JavaScript弹出警告提示用户“Invalid username or password”。
-
如果用户名或密码任一为空,将弹出警告提示“用户名和密码为空”。
3.编写主页,用于跳转至其他界面
php源码:06.php
<?php
header("content-type:text/html;charset=utf8");
session_start();
if(!(empty($_SESSION['username']))){
echo '欢迎用户:' . $_SESSION['username'];
array_unshift($_SESSION['history'],basename(__FILE__));
}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>';
echo'<form action="11.php" method="get">';
echo'<button type="submit">浏览历史</button>';
echo'</form>';
//var_dump ($_SESSION);
?>
-
header("content-type:text/html;charset=utf8");
设置响应内容类型为HTML,并指定字符集为UTF-8,确保中文等多字节字符能够正确显示。 -
session_start();
启动会话,这是处理会话数据前的必要步骤。 -
if(!(empty($_SESSION['username']))){}
检查会话中是否存在名为username
的变量,即判断用户是否已经登录。如果用户已登录:- 输出欢迎信息,包含用户名。
- 更新用户的历史记录(访问过的页面列表),将当前脚本文件名(通过
basename(__FILE__)
获取)添加到历史记录数组的最前面。
-
如果用户未登录,则通过JavaScript弹出警告框提示“未登录,即将重定向”,并重定向到"08.html",这是一个通常用于登录页面的重定向操作。
-
提供了两个按钮形式的表单,分别用于:
- 清除登录信息,通过GET请求发送到"10.php"。这通常是一个登出功能,用于销毁会话数据。
- 查看浏览历史,通过GET请求发送到"11.php"。预计这个页面会展示之前存储在会话变量
'history'
中的用户访问历史。
-
注释掉的
// var_dump ($_SESSION);
用来调试,查看整个会话变量的内容。
4.用户登出,清除会话信息
php源码:10.php
<?php
session_start();
session_destroy();
header("Location: 08.html");
?>
-
session_start(): 这个函数启动一个新的或恢复一个现有的会话。在执行任何与会话相关的操作之前,调用它是必要的。
-
session_destroy(): 这个函数用来销毁当前用户的会话。它会清除与当前会话相关的所有数据,包括会话变量等。当你希望用户注销并结束他们的会话时,这是一个关键的操作,以确保安全和隐私。
-
header("Location: 08.html"): 此行代码发送一个HTTP头信息给浏览器,指示浏览器重定向到指定的URL——在这个例子中是"08.html"。通常,这用于在用户注销后将他们重定向回登录页面或其他默认页面,以避免用户在注销后仍然停留在具有权限要求的页面上。
代码作用:
- 先确保会话已经启动。
- 销毁当前用户的会话,清除所有会话数据,实现用户登出。
- 通过HTTP重定向将用户送回到登录页面("08.html"),完成整个注销流程。
<1>查看保存的session信息
路径:phpStudy\tmp\tmp
5.输出用户历史浏览信息
php源码:11.php
session_start();
//var_dump($_SESSION);
array_unshift($_SESSION['history'],basename(__FILE__));
foreach($_SESSION['history'] as $k=>$v){
echo $v . '<hr><br>';
}
echo'<form action="06.php" method= "get">';
echo'<button type="submit">dianji</button>;';
echo'</form>';
-
session_start();: 启动或恢复一个会话。这是访问会话变量之前必须执行的操作。
-
**array_unshift(_SESSION['history'], basename(__FILE__));**: 这行代码将当前脚本的文件名(通过`basename(__FILE__)`获取)添加到`_SESSION['history']
数组的开头。这意味着每次此脚本运行时,都会记录下这次访问。
array_unshift`函数用于在数组开头插入元素。 -
foreach(𝑆𝐸𝑆𝑆𝐼𝑂𝑁[′ℎ𝑖𝑠𝑡𝑜𝑟𝑦′]𝑎𝑠SESSION[′history′]ask=>𝑣):使用foreach循环遍历‘_SESSION['history']`数组中的每个元素。对于数组中的每一项(每个浏览历史记录),它将执行循环体内的代码。
-
echo $v . '<hr><br>';: 在循环内部,这行代码输出当前的历史记录条目(文件名),并跟随着一个水平分割线
<hr>
和一个换行<br>
,以便在网页上清晰地分隔每个历史记录。 -
echo'<form action="06.php" method= "get">';
echo'<button type="submit">dianji</button>;';
echo'</form>';
拼接form表单,添加按钮,点击返回主页
相关文章:
全栈:session用户会话信息,用户浏览记录实例
PHP中的session是一种存储机制,它允许您存储和跟踪用户在访问Web应用程序时的信息。会话通常用于存储用户特定的数据,如用户ID、购物车内容、用户偏好设置等,这些数据需要在多个页面请求之间保持不变。 session详解 1. 会话是如何工作的 会…...
设计模式--》 装饰模式的应用
装饰模式的定义: 装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 何时应用装饰模式? 1.当需要动态地给…...

深入解析Web前端三大主流框架:Angular、React和Vue
Web前端三大主流框架分别是Angular、React和Vue。下面我将为您详细介绍这三大框架的特点和使用指南。 Angular 核心概念: 组件(Components): 组件是Angular应用的构建块,每个组件由一个带有装饰器的类、一个HTML模板、一个CSS样式表组成。组件通过输入(@Input)和输出(…...

ch3运输层--计算机网络期末复习(持续更新中)
运输层位于网络层之上 运输层协议提供的某些服务受到网络层协议的限制。比如,时限和带宽保证。 运输层也提供自己的特殊服务。比如,可靠数据传输服务,安全性服务。 网络层:两个主机之间的逻辑通信 运输层:两个进程之间的逻辑通信 网络地址:主机的标识(IP地址) 传输地址: …...
mysql中的内连接与外连接
在MySQL中,内连接和外连接是用于从多个表中检索数据的两种不同的连接方式。 内连接(INNER JOIN): 内连接返回两个表之间匹配的行。它只返回两个表中共同匹配的行,如果在一个表中没有匹配到对应的行,则不会显…...

0基础认识C语言(理论+实操 2)
小伙伴们大家好,今天也要撸起袖子加油干!万事开头难,越学到后面越轻松~ 话不多说,开始正题~ 前提回顾: 接上次博客,我们学到了转义字符,最后留下两个转义字符不知道大家有没有动手尝试了一遍&a…...

ChatGPT的基本原理是什么?又该如何提高其准确性?
在深入探索如何提升ChatGPT的准确性之前,让我们先来了解一下它的工作原理吧。ChatGPT是一种基于深度学习的自然语言生成模型,它通过预训练和微调两个关键步骤来学习和理解自然语言。 在预训练阶段,ChatGPT会接触到大规模的文本数据集&#x…...

云计算OpenStack基础
1.什么是虚拟化? •虚拟化是云计算的基础。 •虚拟化是指计算元件在虚拟的而不是真实的硬件基础上运行。 •虚拟化将物理资源转变为具有可管理性的逻辑资源,以消除物理结构之间的隔离,将物理资源融为一个整体。虚拟化是一种简化管理和优化…...
[10] CUDA程序性能的提升 与 流
CUDA程序性能的提升 与 流 1. CUDA程序性能的提升 在本节中,我们会看到用来遵循的基本的一些性能来提升准则,我们会逐一解释它们1.1 使用适当的块数量和线程数量 研究表明,如果块的数量是 GPU 的流多处理器数量的两倍,则会给出最佳性能,不过,块和线程的数量与具体的算法…...

TH方程学习(1)
一、背景介绍 根据CW方程的学习,CW方程的限制条件为圆轨道,不考虑摄动,二者距离相对较小。TH方程则可以将物体间的相对运动推广到椭圆轨道的二体运动模型,本部分将结合STK的仿真功能,联合考察TH方程的有用性ÿ…...

【九十七】【算法分析与设计】图论,迷宫,1207. 大臣的旅费,走出迷宫,石油采集,after与迷宫,逃离迷宫,3205. 最优配餐,路径之谜
1207. 大臣的旅费 - AcWing题库 很久以前,TT 王国空前繁荣。 为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。 为节省经费,TT 国的大臣们经过思考,制定了一套优秀的修建方案,…...

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题
Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段,后端创建对应的实体类的时间属性需要设定格式(默认的格式不方便阅读),再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…...
算法训练营day35
题目1:122. 买卖股票的最佳时机 II - 力扣(LeetCode) 贪心算法思路很简单,就是把每一天的利润都算出来,然后把整的加起来就是结果 class Solution { public:int maxProfit(vector<int>& prices) {int resu…...

代码随想录-Day23
669. 修剪二叉搜索树 方法一:递归 class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root null) {return null;}if (root.val < low) {return trimBST(root.right, low, high);} else if (root.val > high) {return trimBS…...

基于Visual Studio版本的AI编程助手
Visual Studio 是一个出色的 IDE,可用于构建适用于 Windows、Mac、Linux、iOS 和 Android 的丰富、精美的跨平台应用程序。 使用一系列技术(例如 WinForms、WPF、WinUI、MAUI 或 Xamarin)构建丰富。 1、安装 点击上方工具栏拓展选项,选择管理拓展选项 接着在联机页面中搜索&q…...

04-Vue:ref获取页面节点--很简单
目录 前言在Vue中,通过 ref 属性获取DOM元素使用 ref 属性获取整个子组件(父组件调用子组件的方法) 前言 我们接着上一篇文章 03-02-Vue组件之间的传值 来讲。 下一篇文章 05-Vue路由 在Vue中,通过 ref 属性获取DOM元素 我们当然…...
CBK-D2-安全与架构工程.md
CBK-D2-安全与架构工程 密码学和对称密钥算法 密码通信的基础知识 明文P-plaintext、加密encrypt、密文C-ciphertext、解密decrypt、密钥Key 多数情况下,密钥无非是一个极大的二进制数 每一种算法都有一个特定密钥控制key space,是一个特定的数值范围 密钥空间由位大小b…...
Windows驱动开发系列文章一
文章目录 环境搭建如何调试实时调试非实时调试 环境搭建 基本上按照官方网站安装 VisualStudio/SDK/WDK 这些软件就可以了 详情请参考这个安装链接 如何调试 Windows 调试分为两种:一种是实时调试,一种是非实时调试 实时调试 这个就需要用到Microso…...

java项目之人事系统源码(springboot+vue+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人事系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于vue的人事系统的主要使用者…...

I/O '24|学习资源焕新,技术灵感升级
2024 年 5 月 15 日凌晨举行的 Google I/O 大会为各地的开发者们带来了新的灵感。面对技术革新,相信各位开发者们都迫不及待想要自己上手试一试。 别急,Google 谷歌今年为中国的开发者们准备了一份特别的学习资源,让开发者们自由探索新知。 G…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...