深入解析 ASP.NET Core 中的 ResourceFilter
在现代 Web 开发中,ASP.NET Core 提供了强大的过滤器(Filters)机制,用于在处理请求的不同阶段执行特定的代码逻辑。ASP.NET Core 中的 ResourceFilter
是一种非常有用的过滤器类型,允许开发人员在请求到达控制器操作方法之前或响应返回之前执行一些操作。在本文中,我们将详细解析 ResourceFilter
,介绍它的工作原理、使用场景以及如何在实际项目中运用它。
1. 什么是 ResourceFilter
?
1.1 过滤器概述
ASP.NET Core 的过滤器是用于在请求和响应处理的不同阶段执行自定义逻辑的一种机制。过滤器在控制器方法执行之前、之后,或者在异常发生时执行。它们可以帮助开发人员对请求进行验证、处理、修改或者进行其他操作。常见的过滤器类型包括:
-
Authorization Filters(授权过滤器):用于身份验证和授权操作。
-
Resource Filters(资源过滤器):用于资源级的处理,例如缓存、日志记录等。
-
Action Filters(操作过滤器):用于在控制器动作执行之前和之后执行一些操作。
-
Result Filters(结果过滤器):用于在控制器动作返回结果后但在返回响应之前进行操作。
-
Exception Filters(异常过滤器):用于处理在请求处理过程中发生的异常。
在这些过滤器中,ResourceFilter
是最早在请求管道中执行的过滤器之一,通常用于处理一些资源相关的操作,比如缓存管理、日志记录等。
1.2 ResourceFilter
的生命周期
ResourceFilter
主要有两个方法,它们分别在请求处理的不同阶段执行:
-
OnResourceExecuting
:当请求到达控制器操作方法之前执行。此时请求已经经过了路由和模型绑定,但还未执行控制器操作方法。在这里,我们可以处理一些请求级别的资源,如缓存、身份验证检查等。 -
OnResourceExecuted
:当控制器操作方法执行完毕并生成响应之后,响应还没有返回客户端时执行。此时可以执行一些响应后的处理,比如日志记录、缓存处理等。
2. 如何实现 ResourceFilter
?
2.1 实现 IResourceFilter
接口
要实现自定义的 ResourceFilter
,你需要实现 IResourceFilter
接口或继承 ResourceFilterAttribute
类。IResourceFilter
接口包含两个方法:OnResourceExecuting
和 OnResourceExecuted
,你可以在这些方法中定义需要在请求生命周期中的不同阶段执行的操作。
示例:实现一个简单的日志记录过滤器
假设我们需要创建一个 ResourceFilter
,用于记录请求的开始和结束时间。下面是一个简单的实现:
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System;public class LogResourceFilter : IResourceFilter
{private readonly ILogger<LogResourceFilter> _logger;public LogResourceFilter(ILogger<LogResourceFilter> logger){_logger = logger;}// 请求开始时执行public void OnResourceExecuting(ResourceExecutingContext context){_logger.LogInformation($"Request started at {DateTime.Now}");}// 请求结束时执行public void OnResourceExecuted(ResourceExecutedContext context){_logger.LogInformation($"Request ended at {DateTime.Now}");}
}
在这个示例中,LogResourceFilter
记录了每个请求的开始和结束时间。OnResourceExecuting
方法在请求处理开始时执行,而 OnResourceExecuted
方法则在请求处理结束后执行。
2.2 将 ResourceFilter
应用于控制器或方法
创建了 LogResourceFilter
之后,接下来需要将它应用到控制器或具体的方法上。你可以使用 ServiceFilter
或 TypeFilter
特性来应用 ResourceFilter
。
应用于整个控制器
[ServiceFilter(typeof(LogResourceFilter))]
public class HomeController : Controller
{public IActionResult Index(){return View();}
}
应用于控制器方法
public class HomeController : Controller
{[ServiceFilter(typeof(LogResourceFilter))]public IActionResult Index(){return View();}
}
通过这种方式,你可以确保 LogResourceFilter
在请求进入控制器方法之前和之后都能执行日志记录操作。
2.3 使用依赖注入
ResourceFilter
可以依赖注入到控制器或方法中。在 ASP.NET Core 中,依赖注入非常重要,可以让你轻松地管理对象的生命周期。
首先,在 ConfigureServices
方法中注册 LogResourceFilter
:
public void ConfigureServices(IServiceCollection services)
{// 注册自定义的 ResourceFilterservices.AddScoped<LogResourceFilter>();services.AddControllersWithViews();
}
然后使用 ServiceFilter
特性将 LogResourceFilter
应用到控制器或方法。
3. ResourceFilter
的使用场景
ResourceFilter
通常用于一些全局的、与请求资源处理相关的操作。以下是一些典型的应用场景:
3.1 缓存处理
你可以在 OnResourceExecuting
方法中检查请求是否已经被缓存,并返回缓存的结果,避免重复的资源处理。在 OnResourceExecuted
方法中,你可以对响应进行缓存处理。
示例:简单的缓存检查
public class CacheResourceFilter : IResourceFilter
{public void OnResourceExecuting(ResourceExecutingContext context){// 检查是否有缓存的结果var cachedResult = CheckCache(context.HttpContext.Request);if (cachedResult != null){context.Result = cachedResult; // 如果有缓存,直接返回缓存结果}}public void OnResourceExecuted(ResourceExecutedContext context){// 如果没有缓存,可以将结果缓存if (context.Result != null){AddToCache(context.HttpContext.Request, context.Result);}}private object CheckCache(Microsoft.AspNetCore.Http.HttpRequest request){// 这里是检查缓存的逻辑return null; // 示例中返回 null,实际应该根据请求来检查缓存}private void AddToCache(Microsoft.AspNetCore.Http.HttpRequest request, object result){// 将结果添加到缓存}
}
3.2 日志记录
你可以在请求开始时记录请求的信息,在请求结束时记录响应的状态。这对于监控和调试非常有帮助。
3.3 跨域资源共享(CORS)
在请求到达控制器方法之前,你可以通过 ResourceFilter
设置跨域资源共享(CORS)策略,动态控制哪些源可以访问你的资源。
3.4 授权检查
尽管通常授权检查是由 AuthorizationFilter
来完成的,但你也可以在 ResourceFilter
中进行一些额外的验证。比如,根据请求的路径、参数或头信息做一些自定义的权限校验。
4. ResourceFilter
与其他过滤器的对比
ResourceFilter
是在请求管道中最早执行的过滤器之一,它通常用于处理资源相关的操作。而其他过滤器如 ActionFilter
和 AuthorizationFilter
通常在请求处理的其他阶段执行。
-
ResourceFilter
:用于处理资源级的操作,如缓存、日志记录、跨域设置等。 -
ActionFilter
:用于在控制器方法执行前后执行操作,通常用于修改请求或响应数据,或者执行业务逻辑。 -
AuthorizationFilter
:用于身份验证和授权操作,确保请求具有适当的权限。 -
ExceptionFilter
:用于捕获异常并进行处理。
ResourceFilter
通常用于请求级别的预处理操作,而 ActionFilter
则用于处理与具体操作方法相关的任务。
5. 总结
ResourceFilter
是 ASP.NET Core 中非常强大的一种过滤器类型,它允许开发人员在请求处理的早期阶段(控制器方法执行之前)进行资源级的处理。通过实现 IResourceFilter
接口,开发人员可以在请求到达控制器前后执行自定义逻辑,如缓存管理、日志记录、跨域资源共享等。由于 ResourceFilter
在请求管道中执行的优先级较高,因此它非常适用于一些全局的资源处理操作。
掌握 ResourceFilter
的使用,可以帮助你更好地控制请求的生命周期,提升应用的性能和可维护性。
相关文章:
深入解析 ASP.NET Core 中的 ResourceFilter
在现代 Web 开发中,ASP.NET Core 提供了强大的过滤器(Filters)机制,用于在处理请求的不同阶段执行特定的代码逻辑。ASP.NET Core 中的 ResourceFilter 是一种非常有用的过滤器类型,允许开发人员在请求到达控制器操作方…...
Java进阶--面向对象设计原则
设计模式 概念 设计模式,又称软件设计模式,是一套被反复使用,经过分类编目的,代码设计经验的总结。描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方。它是解决特定问题的一系列套路,是…...
java每日精进 4.26【多租户之过滤器及请求处理流程】
一月没更,立誓以后断更三天我就是狗!!!!!!!! 研究多租户框架中一条请求的处理全流程 RestController RequestMapping("/users") public class UserControlle…...
【学习笔记】Stata
一、Stata简介 Stata 是一种用于数据分析、数据管理和图形生成的统计软件包,广泛应用于经济学、社会学、政治科学等社会科学领域。 二、Stata基础语法 2.1 数据管理 Stata 支持多种数据格式的导入,包括 Excel、CSV、文本文件等。 从 Excel 文件导入…...
[MySQL数据库] 事务与锁
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
Rule.issuer(通过父路径配置loader处理器)
说明 正常在设置loader配置规则时,都是通过文件后缀来配置的 issuer的作用是可以通过父级的路径,设置生效的匹配规则 与rule的差别 test: 匹配当前模块的路径(如 .css 文件) issuer: 匹配引入当前模块的父模块的路径࿰…...
MyBatis 插件开发的完整详细例子
MyBatis 插件开发的完整详细例子 MyBatis 插件(Interceptor)允许开发者在已映射语句执行过程中的某一点进行拦截调用,从而实现自定义逻辑。以下是一个完整的 MyBatis 插件开发示例,涵盖所有使用场景,并附有详细注释和总…...
树状数组底层逻辑探讨 / 模版代码-P3374-P3368
目录 功能 实现 Q:但是,c[x]左端点怎么确定呢? Q:那么为什么要以二进制为基础呢? Q:为什么是补码 - ? 区间查询 树形态 性质1.对于x<y,要么c[x]和c[y]不交,要么c[x]包含于c[y] 性质2.c[x] 真包含 于c[x l…...
Eigen库入门
Eigen是一个C模板库,用于线性代数运算,包括矩阵、向量、数值求解和相关算法。它以其高性能、易用性和丰富的功能而闻名。 安装与配置 Eigen是一个纯头文件库,无需编译,只需包含头文件即可使用。 下载Eigen:从官方网站…...
力扣HOT100——102.二叉树层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] /*** Definition for a bi…...
客户案例 | 光热+数智双驱动!恒基能脉的数字化协同与技术创新实践
光热先锋 智领未来 恒基能脉新能源科技有限公司: 创新驱动,智造光热未来行业领航者 恒基能脉新能源科技有限公司是一家立足于光热发电核心技术产品,专注于“光热” 多能互补项目的国家高新技术企业,其核心产品定日镜广泛应用于光热发电、储…...
第十六周蓝桥杯2025网络安全赛道
因为只会web,其他方向都没碰过,所以只出了4道 做出来的: ezEvtx 找到一个被移动的文件,疑似被入侵 提交flag{confidential.docx}成功解出 flag{confidential.docx} Flowzip 过滤器搜索flag找到flag flag{c6db63e6-6459-4e75-…...
构造函数有哪些种类?
构造函数用于对象的初始化。 1.默认构造函数:没有参数,执行默认的初始化操作; 2.参数化构造函数:传入参数的构造函数,允许构造函数初始化成员变量; 3.拷贝构造函数:将同一类型的实例化对象作…...
第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组 [京津冀]
由于官方没有公布题目的数据, 所以代码仅供参考 1. 密密摆放 题目链接:P12337 [蓝桥杯 2025 省 AB/Python B 第二场] 密密摆放 - 洛谷 题目描述 小蓝有一个大箱子,内部的长宽高分别是 200、250、240(单位:毫米)&…...
关于调度策略的系统性解析与物流机器人应用实践
关于调度策略的系统性解析与物流机器人应用实践 一、调度策略的定义与核心目标 调度策略是用于在复杂环境中协调资源分配、任务排序及路径规划的决策框架,旨在通过优化资源利用率和任务执行效率,实现系统整体性能的最优解。其核心目标包括: 动态适应性:应对实时变化(如订…...
探索具身智能协作机器人:技术、应用与未来
具身智能协作机器人:概念与特点 具身智能协作机器人,简单来说,就是将人工智能技术与机器人实体相结合,使其能够在与人类共享的空间中进行安全、高效协作的智能设备。它打破了传统机器人只能在预设环境中执行固定任务的局限&#…...
毕业项目-Web入侵检测系统
1. 项目简介 系统主要分为两大板块:靶标站点和入侵检测系统。靶标站点是系统的被监测对象,而入侵检测系统则是用于检测靶标站点的流量是否存在异常,以及在检测到异常时进行告警。 入侵检测系统的实现过程简述如下: 数据获取与分…...
【分布式系统中的“瑞士军刀”_ Zookeeper】二、Zookeeper 核心功能深度剖析与技术实现细节
在分布式系统的复杂生态中,Zookeeper 凭借其强大的核心功能,成为保障系统稳定运行的关键组件。上篇文章我们了解了 Zookeeper 的基础概念与安装配置,本文将继续深入剖析 Zookeeper 的核心功能,包括分布式锁、配置管理、命名服务和…...
前端学习笔记(四)自定义组件控制自己的css
1、前言及背景 自己写的一个组件有至少3个页面在使用,组件中的部分文字颜色需要统一修改需要根据一个状态字段来显示不同颜色且不希望受父组件影响 注意:博主学习vue截止目前也就半年,如有知识错误之处还请指出不胜感激,祝学习开…...
从描述语言,非功能性需求,需求和架构的一致性三个方面,说明软件需求到架构的映射存在哪些难点
软件需求到架构的映射是软件工程中的关键环节,其难点主要体现在描述语言差异、非功能性需求的复杂性以及需求与架构的一致性维护三个方面。以下是具体分析: 1. 描述语言的差异 难点:需求与架构使用不同的抽象语言描述,导致语义鸿…...
linux blueZ 第五篇:高阶优化与性能调优——蓝牙吞吐、延迟与功耗全攻略
本篇面向已有实战经验的读者,深入探讨 Classic Bluetooth 与 BLE 在 BlueZ 平台上的性能优化和调优方法,包括连接参数、MTU 调整、PHY 选择、缓存管理、并发策略,以及 HCI 抓包、功耗测量与自动化基准测试,助你打造高吞吐、低延迟、超低功耗的蓝牙应用。 目录 为何要做性能…...
linux的例行性工作(at)
使用场景: 生活中,我们有太多场景需要使用到闹钟,比如早上 7 点起床,下午 4 点开会,晚上 8 购物,等等 在 Linux 系统里,我们同样也有类似的需求。比如我们想在凌晨 1 点将文件上传服务器&#…...
JVM考古现场(二十六):执剑人·降维打击的终极审判
楔子:二向箔的颤动——当修真文明遭遇降维打击 "警告!老年代发生维度坍缩!"我腰间悬挂的昆仑镜突然迸发幽蓝光芒,终南山巅的河图洛书大阵中,GC日志正以《奇门遁甲》的格局疯狂演化: // 降维打击…...
腾讯云物联网平台
文档:物联网开发平台 MQTT.fx 快速接入物联网开发平台_腾讯云...
Unity之基于MVC的UI框架-含案例
Unity之基于MVC的UI框架-含案例 使用案例:类《双人成行》3D动作益智冒险类双人控制游戏开发教程 资源地址:https://learn.u3d.cn/tutorial/3d-adventure-william-anna 一、MVC框架概览 本框架以MVC的方式搭建,以View视口的方式展现数据&am…...
【Token系列】01 | Token不是词:GPT如何切分语言的最小单元
文章目录 01 | Token不是词:GPT如何切分语言的最小单元?一、什么是 Token?二、Token 是怎么来的?——BPE算法原理BPE核心步骤: 三、为什么不直接用词或字符?四、Token切分的实际影响五、中文Token的特殊性六…...
C++学习之路,从0到精通的征途:List类的模拟实现
目录 一.list的介绍 二.list的接口实现 1.结点 2.list结构 3.迭代器 (1)begin (2)end 4.修改 (1)insert (2)push_back (3)push_front ࿰…...
Java大师成长计划之第4天:Java中的泛型
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在现代软件开发中,类型安…...
计算机学报 2024年 区块链论文 录用汇总 附pdf下载
计算机学报 Year:2024 1 Title: 区块链中的公钥密码:设计、分析、密评与展望 Authors: Key words: 区块链;公钥密码算法;算法设计;复杂性分析;密评 Abstract: 比特币的成功,吸引了人们研…...
【Castle-X机器人】三、紫外消杀模块安装与调试
持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】紫外消杀模块安装与调试 三、紫外消杀模块安装与调试2.1 安装2.2 调试2.2.1 紫外消杀模块话题2.2.2 测试 三、紫外消杀模块安装与调试 2.1 安装 使用相应工具将紫外消杀模块固定在Castle-X机器人底盘 2.2 调试 2.2…...
精益数据分析(29/126):深入剖析电子商务商业模式
精益数据分析(29/126):深入剖析电子商务商业模式 在创业和数据分析的学习道路上,我们始终在探索如何更精准地把握商业规律,提升业务的竞争力。今天,我们依旧怀揣着共同进步的愿望,深入解读《精…...
AI图像编辑器 Luminar Neo 便携版 Win1.24.0.14794
如果你对图像编辑有兴趣,但又不想花费太多时间学习复杂的软件操作,那么 Luminar Neo 可能就是你要找的完美工具。作为一款基于AI技术的创意图像编辑器,Luminar Neo简化了复杂的编辑流程,即使是没有任何图像处理经验的新手…...
在Mybatis中为什么要同时指定扫描mapper接口和 mapper.xml 文件,理论单独扫描 xml 文件就可以啊
设计考虑因素 历史兼容性: MyBatis早期版本主要依赖XML配置,后来才引入接口绑定方式同时支持两种方式可以保证向后兼容 明确性: 显式指定两种路径可以使映射关系更加明确减少因命名不一致导致的潜在问题 性能考虑: 同时扫描可…...
MyBatis XML 配置完整示例(含所有核心配置项)
MyBatis XML 配置完整示例(含所有核心配置项) 1. 完整 mybatis-config.xml 配置文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""htt…...
【数据结构入门训练DAY-24】美国大选
文章目录 前言一、题目二、解题思路结语 前言 本次训练内容 训练STL中sort的操作方法。训练解题思维。 一、题目 美国大选是按各州的投票结果来确定最终的结果的,如果得到超过一半的州的支 持就可以当选,而每个州的投票结果又是由该州选民投票产生…...
stm32L4R5ZI Nucleo-144 GPIO点灯及按键中断
文章目录 前言一、CubeMx环境配置二、GPIO点灯操作三、按键中断点灯总结 前言 STM32L4R5ZI Nucleo-144是STMicroelectronics推出的一款基于ARM Cortex-M4内核的微控制器芯片。它是STM32L4系列中的一员,针对低功耗和高性能的应用而设计。以下是一些关键特点和技术规格…...
访问Redis时遇到 unknown command ‘FT.INFO‘, with args beginning with 错误的解决方案
在B站学习 图灵程序员-诸葛 的LangChain入门课程《基于Redis保存历史聊天信息》。在实践代码时遇到了一些问题,在这里记录一下,希望能帮助到也在学习的同学。话不多说,上代码,这段代码使用langchain_redis来持久化大模型对话的聊天…...
Swift与iOS内存管理机制深度剖析
前言 内存管理是每一位 iOS 开发者都绕不开的话题。虽然 Swift 的 ARC(自动引用计数)极大简化了开发者的工作,但只有深入理解其底层实现,才能写出高效、健壮的代码,避免各种隐蔽的内存问题。本文将从底层原理出发&…...
数据库系统概论(五)关系模型的数据结构及形式化
数据库系统概论(五)关系模型的数据结构及形式化 前言一、关系:从“表格”说起1.1 关系数据模型中的“关系”是什么?1.2 域(Domain):数据的“类型限定”1.3 笛卡尔积(Cartesian Produ…...
Python类和对象四(十三)
魔法方法: 按位运算 按位于运算 只要相同才是1 或运算: 只要某个位是1结果就是1 、 按位非 将结果取反 按位异或: 左移和右移运算符: 右移两位 右移动n位,就是除以2的n次方 左移两位: 左移n位就是乘…...
Go 1.24 中的弱指针包 weak 使用介绍
在 Go 语言中,“弱指针”指的是不会阻止垃圾回收器(GC)回收目标对象的引用。 当一个对象只剩弱指针指向它,而没有任何强引用时,GC 仍会把该对象当作不可达对象并回收;随后,所有指向它的弱指针会…...
毕业项目-基于深度学习的入侵检测系统
选题背景与意义 随着互联网技术的飞速发展,网络在各个领域中的作用日益重要。然而,伴随着技术的进步,网络安全问题也愈加严峻,网络攻击事件频繁发生,给个人、企业乃至国家带来了巨大的经济损失与安全威胁。入侵检测系…...
Github 2025-04-26 Rust开源项目日报Top10
根据Github Trendings的统计,今日(2025-04-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General Public Li…...
【Hive入门】Hive分桶表深度解析:从哈希分桶到Join优化的完整指南
目录 引言 1 分桶表基础概念 1.1 什么是分桶表 1.2 分桶与分区的区别 2 分桶表设计与创建 2.1 创建分桶表语法 2.2 分桶键选择原则 2.3 桶数确定策略 3 分桶表数据加载 3.1 标准数据加载流程 3.2 分桶表数据验证 4 分桶Join优化原理 4.1 Map端Join优化 4.2 Sort-…...
django之优化分页功能(利用参数共存及封装来实现)
优化分页功能 目录 1.封装分页代码 2.解决分页时覆盖搜索参数的bug 3.优化分页功能 上一篇文章我们讲到了搜索功能和分页展示数据功能。那这篇文章, 在上篇文章的基础上, 会去优化这些功能并解决搜索功能和分页功能不能一起使用的bug。 一、封装分页代码 原本我们的asse…...
linux blueZ 第四篇:BLE GATT 编程与自动化——Python 与 C/C++ 实战
本篇聚焦 BLE(Bluetooth Low Energy)GATT 协议层的编程与自动化实践,涵盖 GATT 基础、DBus API 原理、Python(dbus-next/bleak)示例、C/C++ (BlueZ GATT API)示例,以及自动发现、读写特征、订阅通知、安全配对与脚本化测试。 目录 BLE GATT 基础概念 BlueZ DBus GATT 模…...
前端面试每日三题 - Day 16
这是我为准备前端/全栈开发工程师面试整理的第16天每日三题练习,涵盖事件循环深入解析 、Vue3 响应式系统原理 ,以及 多租户系统设计实践。每道题附带 详细解析、示例代码与脑图建议,助你全面掌握底层原理与架构设计思维。 ✅ 题目 1…...
使用PyTorch实现简单图像识别(基于MNIST手写数字数据集)的完整代码示例,包含数据加载、模型定义、训练和预测全流程
以下是一个使用PyTorch实现简单图像识别(基于MNIST手写数字数据集)的完整代码示例,包含数据加载、模型定义、训练和预测全流程: import torch import torch.nn as nn import torch.optim as optim import torchvision import torc…...
【Android】四大组件之Activity
目录 一、什么是Activity 二、如何创建和配置Activity 三、Activity 跳转与数据传递 四、数据保存与恢复 五、Activity 启动模式 六、自定义返回行为 七、复杂界面布局 你可以把Activity想象成手机屏幕上的一个“页面”。比如,当你打开一个App时,…...
数据库原理(1)
第一章 概论 一、基本概念 数据(Data)是数据库中存储的基本对象,描述事物的符号记录。例如学生的学号、姓名等信息都是数据。 数据库(Database,DB)长期存储在计算机内、有组织的、可共享的大量数据的集合。…...