当前位置: 首页 > news >正文

使用 ASP.NET Core HttpLoggingMiddleware 记录 http 请求/响应

        我们发布了一个应用程序,该应用程序运行在一个相当隐蔽的 WAF 后面。他们向我们保证,他们的产品不会以任何方式干扰我们的应用程序。这是错误的。他们删除了我们几乎所有的“自定义”标头。为了“证明”这一点,我构建了一个中间件,用于存储我们收到和发送的所有唯一标头。然后我创建了一个转储所有标头的端点。

我创建了一个自定义中间件,LogHeadersMiddleware

public class LogHeadersMiddleware 
{
    private readonly RequestDelegate _next;
    private readonly ILogger<LogHeadersMiddleware> _logger;
    public static readonly List<string> RequestHeaders = new List<string>();
    public static readonly List<string> ResponseHeaders = new List<string>();

    public LogHeadersMiddleware(RequestDelegate next, ILogger<LogHeadersMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext context)
    {
        var uniqueRequestHeaders = context.Request.Headers
            .Where(x => RequestHeaders.All(r => r != x.Key))
            .Select(x => x.Key);
        RequestHeaders.AddRange(uniqueRequestHeaders);

        await _next.Invoke(context);
        var uniqueResponseHeaders = context.Response.Headers
            .Where(x => ResponseHeaders.All(r => r != x.Key))
            .Select(x => x.Key);
        ResponseHeaders.AddRange(uniqueResponseHeaders);
        
        // Log unique headers with ILogger
        ...
    }
}

然后我在中间件管道的早期就这样注册了它 

app.UseLogHeadersMiddleware();
app.Map("/show-headers", ShowHeaders);

因此,通过转到 /show-headers,您将看到我们的应用程序接收和发送的所有(唯一)标头的转储。 

新方法

微软现在已经在 ASP.NET Core 中添加了对 HTTP 日志记录的支持。
他们创建了自己的中间件,您可以像这样启用它:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Important to have it as early as possible
    app.UseHttpLogging(); 
    ...
    ...
    ...
}

如果您不进行任何自定义,则默认记录以下内容(请求和响应):

Request path
Status code
Querystring
Headers 

示例 - 默认实现

向 /user/login
主体发出 POST 请求

{
   "username": "josef",
   "password": "MyPassword"
}

Request 

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Protocol: HTTP/1.1
      Method: POST
      Scheme: http
      PathBase:
      Path: /user/login
      QueryString:
      Accept: */*
      Connection: keep-alive
      Host: localhost:5000
      User-Agent: PostmanRuntime/7.28.1
      Accept-Encoding: gzip, deflate, br
      Content-Type: application/json
      Content-Length: 60 

Response

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      StatusCode: 200
      Content-Type: application/json; charset=utf-8
      Date: [Redacted]
      Server: [Redacted]
      Transfer-Encoding: chunked 

如您所见,使用默认配置,不会记录任何敏感信息。
让我们看看如何配置中间件来记录一些敏感数据。

示例 - 记录请求/响应主体

请求正文(危险)

这将记录请求标头和正文

services.AddHttpLogging(options =>
{
    options.LoggingFields = HttpLoggingFields.RequestPropertiesAndHeaders |
                            HttpLoggingFields.RequestBody;
});

Body体

{
    "username": "josef",
    "password": "MyPassword"
}

Request 

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Protocol: HTTP/1.1
      Method: POST
      Scheme: http
      PathBase:
      Path: /user/login
      QueryString:
      Accept: */*
      Connection: keep-alive
      Host: localhost:5000
      User-Agent: PostmanRuntime/7.28.1
      Accept-Encoding: gzip, deflate, br
      Content-Type: application/json
      Content-Length: 60

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      RequestBody: {
          "username": "josef",
          "password": "MyPassword"
      }

响应主体(危险)

这将记录响应标头和正文

services.AddHttpLogging(options =>
{
    options.LoggingFields = HttpLoggingFields.ResponsePropertiesAndHeaders |
                            HttpLoggingFields.ResponseBody;
});

Body

{
    "username": "josef",
    "password": "MyPassword"
}

Response

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Response:
      StatusCode: 200
      Content-Type: application/json; charset=utf-8

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      ResponseBody: {"token":"very secret token"}

        如您所见,我们现在正在记录请求和响应主体。这在开发/调试期间可能非常有用,但您很可能永远不想在生产中这样做。通过盲目地记录请求/响应标头/主体,您可以(很可能)记录敏感数据。如果您觉得有必要记录标头和主体,请确保使用选择加入策略,如下所示:

services.AddHttpLogging(options =>
{
    options.LoggingFields = HttpLoggingFields.RequestPropertiesAndHeaders |
                            HttpLoggingFields.ResponsePropertiesAndHeaders;
    options.ResponseHeaders.Add("Non-Sensitive");
});

调用以下操作时...

[HttpGet("api/weather")]
public IActionResult Index()
{
    Response.Headers.Add("Sensitive", "034D4CD7-2FEB-4B19-86A3-CFCD5DB291AA");
    Response.Headers.Add("Non-Sensitive", "Hello");
    return new OkObjectResult(new
    {
        data = "Hello World"
    });

...仅会记录非敏感标头 

Request

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
Response:
StatusCode: 200
Content-Type: application/json; charset=utf-8
Date: [Redacted]
Server: [Redacted]
Transfer-Encoding: chunked
Sensitive: [Redacted]
Non-Sensitive: Hello

表现

考虑记录请求/响应主体时应用程序的性能会受到怎样的影响也很重要
。GET

没有 HttpLogging

❯ .\bombardier.exe -c 125 -n 100000 http://localhost:5000/api/weather
Bombarding http://localhost:5000/api/weather with 100000 request(s) using 125 connection(s)100000 / 100000 [==========================================] 100.00% 2287/s 43s
Done!
Statistics        Avg      Stdev        MaxReqs/sec      2292.70     326.38    7095.61Latency       54.52ms     2.29ms   109.00msHTTP codes:1xx - 0, 2xx - 100000, 3xx - 0, 4xx - 0, 5xx - 0others - 0Throughput:   727.39KB/s

HttpLogging 的默认设置

❯ .\bombardier.exe -c 125 -n 100000 http://localhost:5000/api/weather
Bombarding http://localhost:5000/api/weather with 100000 request(s) using 125 connection(s)100000 / 100000 [==========================================] 100.00% 1492/s 1m6s
Done!
Statistics        Avg      Stdev        MaxReqs/sec      1496.73     287.61    4500.00Latency       83.52ms    15.73ms      0.86sHTTP codes:1xx - 0, 2xx - 100000, 3xx - 0, 4xx - 0, 5xx - 0others - 0Throughput:   474.86KB/s

已启用请求/响应主体日志记录

❯ .\bombardier.exe -c 125 -n 100000 http://localhost:5000/api/weather
Bombarding http://localhost:5000/api/weather with 100000 request(s) using 125 connection(s)100000 / 100000 [==========================================] 100.00% 1466/s 1m8s
Done!
Statistics        Avg      Stdev        MaxReqs/sec      1471.50     285.97    5090.86Latency       84.96ms    17.64ms      0.87sHTTP codes:1xx - 0, 2xx - 100000, 3xx - 0, 4xx - 0, 5xx - 0others - 0Throughput:   466.79KB/s

当打开HttpLogging时,吞吐量从 ~2300 req/s 变为 ~1500 req/
s.POST

没有 HttpLogging

❯ .\bombardier.exe -m POST http://localhost:5000/user/login -c 125 -n 100000 --duration 1s -l -H "Content-Type: application/json" -f "login.json"
Bombarding http://localhost:5000/user/login with 100000 request(s) using 125 connection(s)100000 / 100000 [==========================================] 100.00% 2112/s 47s
Done!
Statistics        Avg      Stdev        MaxReqs/sec      2118.76     444.32    6498.38Latency       59.03ms    14.41ms   576.00msLatency Distribution50%    57.00ms75%    59.96ms90%    70.00ms95%    75.00ms99%    90.81msHTTP codes:1xx - 0, 2xx - 100000, 3xx - 0, 4xx - 0, 5xx - 0others - 0Throughput:   771.02KB/s

HttpLogging 的默认设置

❯ .\bombardier.exe -m POST http://localhost:5000/user/login -c 125 -n 100000 --duration 1s -l -H "Content-Type: application/json" -f "login.json"
Bombarding http://localhost:5000/user/login with 100000 request(s) using 125 connection(s)100000 / 100000 [==========================================] 100.00% 1388/s 1m12s
Done!
Statistics        Avg      Stdev        MaxReqs/sec      1392.11     328.62    8995.50Latency       89.92ms    19.01ms      1.09sLatency Distribution50%    88.00ms75%    91.00ms90%    97.00ms95%   111.00ms99%   125.00msHTTP codes:1xx - 0, 2xx - 100000, 3xx - 0, 4xx - 0, 5xx - 0others - 0Throughput:   506.18KB/s

已启用请求/响应主体日志记录

❯ .\bombardier.exe -m POST http://localhost:5000/user/login -c 125 -n 100000 --duration 1s -l -H "Content-Type: application/json" -f "login.json"
Bombarding http://localhost:5000/user/login with 100000 request(s) using 125 connection(s)100000 / 100000 [==========================================] 100.00% 1281/s 1m18s
Done!
Statistics        Avg      Stdev        MaxReqs/sec      1284.89     311.66    4550.25Latency       97.31ms    21.58ms      1.22sLatency Distribution50%    95.00ms75%    99.00ms90%   108.00ms95%   119.00ms99%   150.00msHTTP codes:1xx - 0, 2xx - 100000, 3xx - 0, 4xx - 0, 5xx - 0others - 0Throughput:   467.73KB/s

我们可以看到,记录更多内容会对性能造成影响。记录请求/响应主体时,我们每秒会额外损失约 100 个请求。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。  

相关文章:

使用 ASP.NET Core HttpLoggingMiddleware 记录 http 请求/响应

我们发布了一个应用程序&#xff0c;该应用程序运行在一个相当隐蔽的 WAF 后面。他们向我们保证&#xff0c;他们的产品不会以任何方式干扰我们的应用程序。这是错误的。他们删除了我们几乎所有的“自定义”标头。为了“证明”这一点&#xff0c;我构建了一个中间件&#xff0c…...

沃丰科技智能客服在跨境电商独立站中的核心角色

随着全球化进程的加速和互联网技术的不断发展&#xff0c;跨境电商行业蓬勃兴起&#xff0c;为消费者提供了更广阔、更便捷的购物选择。在这样一个竞争激烈的市场环境中&#xff0c;优质的客户服务成为了企业脱颖而出的关键。沃丰科技智能客服凭借其先进的技术和人性化的设计理…...

基于Springboot滑雪物品在线租赁网站设计与实现(作品+论文+开题报告)

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…...

android 富文本及展示更多组件

模拟微博 #热贴 和 用户 的这种 富文本形式组件&#xff0c;不说了&#xff0c; 直接上代码 package com.tongtong.feat_watch.viewimport android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater impo…...

Java-JMX 组件架构即详解

JMX架构由三个主要组件构成&#xff1a; ‌MBeans&#xff08;Managed Beans&#xff09;‌&#xff1a;代表可管理的资源&#xff0c;是JMX的核心。MBean可以是Java类或接口&#xff0c;提供了管理操作的接口&#xff0c;如获取系统信息、设置参数等。‌MBeanServer‌&#x…...

开源轻量级文件分享服务Go File本地Docker部署与远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Rust快速入门(五)

生命周期 生命周期的主要作用是避免悬垂引用。 这里我们详细说说借用检查&#xff1a; {let r; // ----------- a// |{ // |let x 5; // --- b |r &x; // | |} /…...

租赁系统|租赁小程序|租赁小程序成品

租赁系统是现代企业管理中不可缺少的数字化工具&#xff0c;它通过高效的信息整合与流程管理&#xff0c;为企业带来极大的便利和效益。一个完善的租赁系统开发应具备以下必备功能&#xff1a; 一、用户管理 用户管理模块负责系统的访问控制&#xff0c;包括用户注册、登录验证…...

后端-pageHelp分页查询

在pom.xml文件中先导入分页的坐标 PageResult里面有两个后端返回给前端的参数&#xff0c;我们最后把PageResult再封装到Result中&#xff0c; PageResult和Result都是工具类 EmployeeDTO中是前端页面中的模糊查询字段和分页的两个值 注意&#xff01; 括号中的参数Employee…...

MySQL | 尚硅谷 | 第15章_存储过程与函数

MySQL笔记&#xff1a;第15章_存储过程与函数 文章目录 MySQL笔记&#xff1a;第15章_存储过程与函数第15章_存储过程与函数 1. 存储过程概述1.1 理解1.2 分类 2. 创建存储过程2.1 语法分析2.2 代码举例 3. 调用存储过程3.1 调用格式3.2 代码举例3.3 如何调试存储过程演示代码 …...

汽车零部件设计之——麦弗逊悬架KC特性分析仿真APP介绍

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天&#xff0c;汽车零部件需…...

代码随想录-算法训练营day41(动态规划04:01背包,01背包滚动数组,分割等和子集)

第九章 动态规划part04● 01背包问题&#xff0c;你该了解这些&#xff01; ● 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 ● 416. 分割等和子集 正式开始背包问题&#xff0c;背包问题还是挺难的&#xff0c;虽然大家可能看了很多背包问题模板代码&#xf…...

Vue Loader的作用

Vue Loader是一个专门用于处理Vue单文件组件&#xff08;SFCs&#xff0c;即Single File Components&#xff09;的webpack加载器&#xff08;loader&#xff09;。以下是Vue Loader的具体作用&#xff1a; 1、解析和转换Vue单文件组件 Vue Loader能够解析和转换.vue文件&…...

SRS 服务器入门:实时流媒体传输的理想选择

在当今视频流媒体需求爆炸式增长的时代&#xff0c;如何选择一款高效、稳定且功能强大的流媒体服务器成为了许多开发者和企业关注的焦点。而 SRS&#xff08;Simple Realtime Server&#xff09;作为一款开源的流媒体服务器&#xff0c;以其卓越的性能和灵活的功能&#xff0c;…...

4K高清壁纸网站推荐

1. Awesome Wallpapers 官网: https://4kwallpapers.com/ 主题: 创意、摄影、人物、动漫、绘画、视觉 分辨率: 4K Awesome Wallpapers 提供了丰富的高质量图片&#xff0c;分为通用、动漫、人物三大类&#xff0c;可以按屏幕比例和分辨率检索&#xff0c;满足你对壁纸的各种…...

如何保证数据库和缓存双写一致性?

数据库和缓存&#xff08;redis&#xff09;双写数据一致性问题再高并发的场景下&#xff0c;是一个很严重的问题&#xff0c;无论在工作中&#xff0c;还是面试&#xff0c;遇到的概率非常大&#xff0c;这里就聊一聊目前的常见解决方案以及最优方案。 常见方案 缓存的主要目…...

QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示

Qt的QTreeWidget来显示嵌套结构体的成员&#xff0c;并以树形结构展示。 #include <QApplication> #include <QTreeWidget> #include <QTreeWidgetItem> #include <QString> #include <cstdint>// 假设这些是你的结构体定义 struct BaseMeterPa…...

《深入浅出HTTPS》读书笔记(17):公开密钥算法

公开密钥算法&#xff08;Public Key Cryptography&#xff09;&#xff0c;也称为非对称加密算法&#xff08;Asymmetrical Cryptography&#xff09;。 公开密钥算法的功能比较多&#xff0c;可以进行加密解密、密钥协商、数字签名。 【密钥是一对】 公开密钥算法的密钥是一对…...

React 中为什么不直接使用 requestIdleCallback?

首先看下 requestIdleCallback是什么&#xff1f; 简介 requestIdleCallback 是一个在浏览器空闲时执行低优先级任务的 API。 定义与用途 requestIdleCallback 方法允许开发者在浏览器的空闲时段内调度函数的执行。这些函数通常用于执行非关键性的、低优先级的任务&#xff0c…...

工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法

工作&#xff1a;SolidWorks从3D文件导出2D的DWG或DXF类型文件方法 SolidWorks从3D文件导出2D的DWG或2D DXF类型文件方法&#xff08;一&#xff09;打开3D文件&#xff08;二&#xff09;从装配体到工程图&#xff08;三&#xff09;拖出想要的角度的图型&#xff08;四&#…...

element-ui radio和checkbox禁用时不置灰还是原来不禁用时的样式

把要紧用的内容加上一个class"notEdit-page" z注意要在style里面写不能加上scoped /*//checkBox自定义禁用样式*//*//checkBox自定义禁用样式*/ .notEdit-page.el-checkbox__input.is-disabled.is-checked.el-checkbox__inner::after {border-color: #fff; } .notEdi…...

MySQL 8.0 安装与配置技术文档(Ubuntu22.04)

MySQL 8.0 安装与配置技术文档 目录 环境准备下载 MySQL 安装包检查是否已安装 MySQL彻底卸载 MySQL安装 MySQL配置 MySQL创建用户并允许外网访问修改 root 用户密码参考链接 1. 环境准备 确保系统为 Ubuntu 22.04&#xff0c;并安装了以下基础工具&#xff1a; sudo apt-ge…...

【Linux】Ubuntu中安装多个版本的gcc、g++编译器,并自由切换

1、安装 1.1 命令安装 使用命令直接安装: sudo apt install gcc-[版本号] sudo apt install g++-[版本号]例如: sudo apt install gcc-10 sudo apt install g++-10 sudo apt install gcc-9 sudo apt install g++-9 sudo apt install gcc-8 sudo apt install g++-81.2 源码…...

uni-app登录界面样式

非常简洁的登录、注册界面模板&#xff0c;使用uni-app编写&#xff0c;直接复制粘贴即可&#xff0c;无任何引用&#xff0c;全部公开。 废话不多说&#xff0c;代码如下&#xff1a; login.vue文件 <template><view class"screen"><view class"…...

如何在小米平板5上运行 deepin 23 ?

deepin 23 加入了 ARM64 支持&#xff0c;这里尝试将 deepin 系统刷入平板中&#xff0c;平常使用中&#xff0c;带个笔记本电脑有时候也会嫌比较麻烦&#xff0c;把 Linux 系统刷入平板中既满足了使用需要&#xff0c;又满足了轻便的需求。为什么不使用 Termux &#xff1f;虽…...

Linux上的C语言编程实践

说明&#xff1a; 这是个人对该在Linux平台上的C语言学习网站笨办法学C上的每一个练习章节附加题的解析和回答 ex1: 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后运行它看看发生了什么。 vim ex1.c打开 ex1.c 文件。假如我们删除 return 0…...

ubuntu中使用ffmpeg库进行api调用开发

一般情况下&#xff0c;熟悉了ffmpeg的命令行操作&#xff0c;把他当成一个工具来进行编解码啥的问题不大&#xff0c;不过如果要把功能集成进自己的软件中&#xff0c;还是要调用ffmpeg的api才行。 ffmpeg的源码和外带的模块有点太多了&#xff0c;直接用官网别人编译好的库就…...

基于yolov8的SAR影像目标检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的SAR影像目标检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的SAR影像目标…...

【源码】Sharding-JDBC源码分析之SQL中读写分离动态策略、数据库发现规则及DatabaseDiscoverySQLRouter路由的原理

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

服务器卸载安装的 Node.js

卸载安装的 Node.js 版本&#xff0c;具体步骤取决于你是通过包管理器&#xff08;如 yum 或 dnf&#xff09;安装的&#xff0c;还是通过 nvm (Node Version Manager) 安装的。以下是针对这两种情况的指南。 通过包管理器卸载 Node.js 如果你是通过 yum 或 dnf 安装的 Node.…...

一键图片提取表格导出为Excel文档工具体验

在日常工作中&#xff0c;我们经常会遇到需要将图片中的表格数据转换为可编辑的Excel文件的情况。这不仅能够提高工作效率&#xff0c;还能减少手动输入数据的错误。本文将介绍一款实用的工具&#xff0c;它能够帮助我们快速实现图片到Excel的转换&#xff0c;同时保持操作的简…...

SpringBoot异常处理

SpringBoot异常处理 一、认识异常 异常分类&#xff1a; Error: 代表编译和系统错误&#xff0c;不允许捕获Exception: 标准Java库的方法所激发的异常&#xff0c;包含运行异常Runtime_Exception和非运行异常 Non_RuntimeException 的子类Runtime_Exception: 运行时异常。No…...

在 OAuth 2.0 中,refreshToken(刷新令牌)存在的意义

在 OAuth 2.0 中&#xff0c;refreshToken&#xff08;刷新令牌&#xff09; 的主要目的是为了提升用户体验和安全性&#xff0c;同时确保访问令牌的有效性。以下是需要使用 refreshToken 的原因&#xff1a; 1. 访问令牌的有限生命周期 访问令牌&#xff08;accessToken&…...

【Redis】壹 —— Redis 介绍

文章目录&#xff1a; 前言 一、认识Redis 1. Redis 用途 作为数据库 作为流引擎 二、服务端高并发分布式结构演变 1. 单机架构 2. 应用数据分离架构 3. 应用服务集群架构 4. 读写分离 / 主从分离架构 5. 冷热分离 —— 引入缓存 6. 分库分表 7. 微服务架构 8. …...

【html网页页面010】html+css制作茶品牌文创网页制作含视频元素(7页面附效果及源码)

茶主题品牌文创网页制作 &#x1f964;1、写在前面&#x1f367;2、涉及知识&#x1f333;3、网页效果完整效果(7页)&#xff1a;代码目录结构&#xff1a;page1、主页page2、精品包装page3、茶园一角page4、品牌地带page5、衍生品page6、联X我们page7、视频详情页 &#x1f30…...

【项目实战】基于python+爬虫的电影数据分析及可视化系统

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;文末咨询即可。 本文目录 1.开发环境2 系统设计 2.1 设计背景2.2 设计内容 3 系统页面展示 3.1 用户页面3.2 后台页面3.3 功能展示视频 4 更多推荐5 部分功能代码 5.1 爬虫代码5.2 电影信息代码 1.开发环…...

K8S命令部署后端(流水线全自动化部署)

前言 本文为链接: 云效流水线k8s半自动部署java&#xff08;保姆级&#xff09;的补充,本文起初的目的是为了补充完善k8s流水线的全自动化部署,但是也适用于k8s的一键重启,因为使用k8s的web页面容易出现漏点的情况,因此也可以把代码保存为shell脚本,同样可以实现一键重启。关于…...

GPS北斗卫星授时服务器功能是什么?应用是什么?

GPS北斗卫星授时服务器功能是什么&#xff1f;应用是什么&#xff1f; GPS北斗卫星授时服务器功能是什么&#xff1f;应用是什么&#xff1f; 摘 要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的应用与发展,最后指出时间同步网络…...

学习笔记064——如何手动将jar包导入到maven本地库

文章目录 1、背景&#xff1a;2、方法 1、背景&#xff1a; 有时网络慢的情况&#xff0c; 本地maven库需要导入外部下载的jar包。 以便于在项目的pom文件中&#xff0c;直接写dependency写导入依赖。 2、方法 在Windows终端中&#xff0c;输入&#xff1a; mvn install:in…...

未来趋势系列 篇二:HBM题材解析和股票梳理

文章目录 系列文章HBM题材解析环氧塑封电镀液PSPI(光敏性聚酰亚胺)前驱体封装基板其他材料TSV技术封装测试股票梳理系列文章 未来趋势系列 篇一:AI题材解析和股票梳理 HBM HBM(High Bandwidth Memory,高带宽内存)是一种专为高效能运算设计的新兴高速内存接口技术。它通…...

网卡驱动测试

以下是网卡驱动不同测试类型的具体方法和命令&#xff1a; 1. 功能性测试 驱动加载/卸载测试&#xff1a; 方法&#xff1a;加载/卸载网卡驱动&#xff0c;观察日志是否报错。命令&#xff1a; modprobe <driver_name> # 加载驱动 rmmod <driver_name> # 卸载驱动…...

DDR的跨4K问题

参考视频&#xff1a;【深入理解FPGA底层逻辑】、4k边界和outsdanding_哔哩哔哩_bilibili 1、AXI4_FULL突发写一个字节是一个地址&#xff0c; 2、协议规定&#xff0c;把AXI4从机的地址区间从0进行到了4095....每4K进行一次分配 所以突发长度的计算如下&#xff1a; 另外AX…...

数据结构---栈(Stack)

1. 简介 栈&#xff08;Stack&#xff09;是计算机科学中的一种抽象数据类型&#xff0c;它遵循特定的操作顺序&#xff0c;即后进先出&#xff08;Last In First Out&#xff0c;LIFO&#xff09;。这意味着最后添加到栈中的元素将是第一个被移除的。栈的基本操作通常包括&am…...

【JavaWeb后端学习笔记】Java上传文件到阿里云对象存储服务

阿里云对象存储 1、创建阿里云对象存储节点2、上传文件2.1 修改项目配置文件2.2 定义一个Properties类获取配置信息2.3 准备一个alioss工具类2.4 创建注册类&#xff0c;将AliOssUtil 注册成Bean2.5 使用AliOssUtil 工具类上传文件2.6 注意事项 使用阿里云对象存储服务分为以下…...

Unity3D RPG战斗系统详解

前言 设计一个RPG&#xff08;角色扮演游戏&#xff09;的战斗系统是游戏开发中的关键环节&#xff0c;它决定了游戏的乐趣和挑战性。在Unity3D中&#xff0c;可以通过多种技术和工具来实现一个功能完善的战斗系统。以下是对RPG战斗系统的技术详解以及代码实现。 对惹&#x…...

Spark架构及运行流程

Spark架构图 Driver&#xff1a; 解析用户的应用程序代码&#xff0c;转化为作业(job)。创建SparkContext上下文对象&#xff0c;其负责与资源管理器(ClusterManager)通信&#xff0c;进行资源的申请、任务的分配和监控等。跟踪Executor的执行情况。可通过UI界面查询运行情况。…...

SpringBoot3整合MyBatis

一、MyBatis整合步骤: (1).导入依赖:在Spring Boot项目的构建文件(如pom.xml)中添加MyBatis和数据库驱动的相关依赖。例如&#xff0c;如果使用MySQL数据库&#xff0c;您需要添加MyBatis和MySQL驱动的依赖。 (2).配置数据源:在application.properties或application.yml中配置…...

【计网笔记】习题

物理层 不属于物理层接口规范定义范畴的是&#xff08;C&#xff09; A. 接口形状 B. 引脚功能 C. 物理地址 D. 信号电平 【2023-912】光网络只能通过导向型介质传播。&#xff08;&#xff09; 【2017-408】若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB条件下的…...

力扣56.合并区间

题目描述 题目链接56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; …...

【oracle】大数据删除插入

文章目录 引言本文目标 Oracle大数据插入操作插入操作的场景和需求使用并行查询进行数据插入示例代码&#xff1a;创建新表并插入数据解释代码中的关键点 性能优化建议 Oracle大数据删除操作删除操作的场景和需求使用游标和批量处理进行数据删除示例代码&#xff1a;批量删除数…...