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

Spring Security 6 系列之一 - 开篇入门

之所以想写这一系列,是因为之前工作过程中使用Spring Security,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0,关键是其风格和内部一些关键Filter大改,导致在配置同样功能时,多费了些手脚,因此花费了些时间研究新版本的底层原理,这里将一些学习经验分享给大家。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 spring-boo-3.3.0(默认引入的Spring Security是6.3.0),JDK版本使用的是19,所有代码都在spring-security-study项目上:https://github.com/forever1986/spring-security-study.git

目录

  • 1 Spring Security
    • 1.1 身份认证
    • 1.2 访问控制(授权)
    • 1.3 其它框架
  • 2 第一个入门示例
  • 3 默认配置的原理
  • 4 通过yaml配置自定义账号密码

1 Spring Security

什么是Spring Security,以下是官方地址截图说明
在这里插入图片描述
这里是翻译工具翻译结果:

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于spring的应用程序的事实上的标准。
Spring Security是一个框架,专注于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于它可以轻松地扩展以满足自定义需求

我们可以从描述中把握几个关键词:身份认证访问控制(授权)标准自定义需求
说明Spring Security是一个具备身份认证和访问控制的框架,其流程认证和授权流程具备一定行业标准,同时还能通过其扩展点自定义符合自己业务的需求。下面我们就身份认证和授权2个功能以及其它类似Spring Security框架做一下详细说明

1.1 身份认证

我们在做业务系统的时候,对于某些界面、接口都需要做登录认证,其实就是身份认证。只有通过身份认证的请求才能访问程序,不然就会返回http401状态。Spring Security就默认内置身份认证功能,让用户无需太多代码,即可实现一个简单用户密码登录认证。

1.2 访问控制(授权)

访问控制或者授权,其目的是对资源进行细粒度的控制,比如某个页面或者接口,只有具备什么权限的用户才能够访问。我们如果做过权限系统,应该了解ACLs、RBAC、ABAC等权限模式,而Spring Security就内置了一种标准的权限模式,可通过配置或者注解方式实现类似ACLs权限模式。

1.3 其它框架

除了Spring Security之外,是否有类似的其它安全框架
Apache Shrio:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。相对于Spring Security来说,是一款轻量级的框架
Sa-Token:Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权 等一系列权限相关问题,并且它是国内的开源项目。github上这么写:当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅!
CAS (Central Authentication Service):CAS是一个独立的企业级单点登录解决方案,为Web应用程序提供了一个集中的认证机制。它允许用户在多个应用程序中使用相同的凭证进行登录。

2 第一个入门示例

Spring Security其实是一个入门门槛较高的框架,但是自从和spring-boot集成之后,其使用就简便很多。话不多说,我们开始体验一把。

新建一个父模块:spring-security-study,该模块只作为统一pom引入作用,没有其它功能或代码
入门示例代码参考lesson01子模块

1)新建一个父模块spring-security-study,其pom文件引入如下:(这里只是声明版本,有些引入只是为了后面使用提前引入而已)

<?xml version="1.0" encoding="UTF-8"?>
<properties><maven.compiler.source>19</maven.compiler.source><maven.compiler.target>19</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>3.3.0</spring-boot.version><commons-pool2.version>2.12.0</commons-pool2.version><jaxb-api.version>2.3.1</jaxb-api.version><jjwt.version>0.9.0</jjwt.version><lombok.version>1.18.36</lombok.version><mybatis-plus.version>3.5.5</mybatis-plus.version><mysql.version>8.0.19</mysql.version><druid.version>1.2.9</druid.version><fastjson.version>1.2.83</fastjson.version></properties><dependencyManagement><dependencies><!-- 引入spring boot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- lombok依赖,用于get/set的简便--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><!-- mysql依赖,用于连接mysql数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- mybatis-plus依赖,用于使用mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>${mybatis-plus.version}</version><type>jar</type></dependency><!-- jjwt依赖,用于使用JWT--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version></dependency><!-- jaxb-api依赖,在java17之后,被移除了,但是在做JWT解析时需要使用--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>${jaxb-api.version}</version></dependency><!-- pool2和druid依赖,用于mysql连接池--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons-pool2.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- fastjson依赖,用于json转换--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency></dependencies></dependencyManagement><!-- maven仓库 --><repositories><repository><id>central</id><url>https://maven.aliyun.com/repository/central</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>

2)新建子模块lesson01,其pom文件引入如下:

<dependencies><!--Spring Boot 的 web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Spring Boot 提供的 Security 启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
</dependencies>

3)在子模块lesson01,新建一个DemoController,里面有一个demo接口,返回简单字符串

@RestController
public class DemoController {@GetMapping("/demo")public String demo() {return"demo";}
}

4)设置启动类SecurityLesson01Application,并启动项目
5)访问:http://127.0.0.1:8080/demo 你会得到以下的界面
在这里插入图片描述
是的,你被强制需要登录才能访问demo接口

6)这时候输入用户名:user,密码(在控制台有一串自动生成的密码,如下图)。之后你就能访问demo页面

在这里插入图片描述

3 默认配置的原理

我们看到只需要引入一个spring-boot-starter-security的依赖,整个项目就会被Spring Security给管理起来。那么spring-boot-starter-security到底做了什么。
熟悉spring-boot的朋友都知道,约定大于配置。在spring-boot中就是默认对Spring Security进行了配置。
1)我们可以从spring-boot的autoconfigure中找到SecurityAutoConfiguration的自动化配置
在这里插入图片描述
2)进入SecurityAutoConfiguration这个配置类,该类没什么内容,但是注解中有2个类SpringBootWebSecurityConfiguration.class和SecurityProperties.class比较重要
在这里插入图片描述

3)SpringBootWebSecurityConfiguration类中的defaultSecurityFilterChain就是默认配置。这里简单说明一下每一步骤的作用。我们先知道Spring Security是基于一个Filter过滤器的链路方式进行一系列操作,后续会着重讲解其不同过滤器的作用。
在这里插入图片描述

这里说明一下,Spring Security的认证方式有多种,里面包括formLogin方式、HTTP Basic等,甚至可以自定义。如果你不使用默认HTTP认证,而是配置HTTP Basic。那么认证就不是通过一个登录页面,而是会弹出一个HTTP Basic对话框(如下图),有兴趣的朋友可以去了解一下HTTP Basic authentication(就是在Postman工具有一项Authorization配置),这里就不细说。
在这里插入图片描述

4)SecurityProperties类就是定义登录的用户名和密码,里面头部的properties注解是读取yaml配置,如果没有yaml配置,则给出一个默认用户user以及随机生成一串密码。这就解释了为什么我们什么都没配置,Spring Security就开始工作,还给我们生成了用户名密码

在这里插入图片描述

4 通过yaml配置自定义账号密码

我们可以通过配置application.yml文件,为Spring Security配置默认用户名和密码,这样就不会使用默认user和随机密码

server:port: 8080
spring:application:name: lesson01security:user:name: moopassword: 1234

结语:问题来了,即使通过这种配置自定义账号密码,在业务上面来说,也不会有人将用户名和密码放到配置文件中,一般都会放到数据库中。那么Spring Security也考虑到这种情况,下一章我们来讲解:Spring Security基于数据库的用户认证和认证原理

相关文章:

Spring Security 6 系列之一 - 开篇入门

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级为6.3.0&#xff0c;关键是其风…...

Spring Cloud概述

1. 认识微服务 1.1 单体架构 很多创业公司早期或者传统企业会把业务的所有功能实现都打包在⼀个项⽬, 这就是单体架构. 业务的所有功能实现都打包在⼀个war包或者Jar包中, 这种⽅式就称为单体架构. 举个例子: 电商系统包括: ⽤⼾管理, 商品管理, 订单管理, ⽀付管理, 库存…...

mvc如何给action传递参数

步骤(常规方法) 新建一个控制器--LarsController.cs using Microsoft.AspNetCore.Mvc; namespace Blog.Controller; public class LarsController:Controller -----继承 {public IActionResult Index(){return View();} }获取id // program.cs中默认值是idpublic IAction…...

【银河麒麟高级服务器操作系统】有关dd及cp测试差异的现象分析详解

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn dd现象 使用银河麒麟高级服务器操作系统执行两次…...

视频智能分析平台LiteAIServer未戴安全帽检测算法助力矿山安全:精准监督矿工佩戴安全帽情况

矿山作业环境复杂多变&#xff0c;安全隐患层出不穷。其中&#xff0c;矿工未佩戴安全帽这一行为&#xff0c;看似微不足道&#xff0c;实则潜藏着巨大的安全风险。一旦发生事故&#xff0c;未佩戴安全帽的矿工将极易受到重创&#xff0c;甚至危及生命。因此&#xff0c;确保每…...

整数的四舍五入----->记录每一点进步

我们知道整数类型的变量对小数部分都不感冒&#xff0c;只要是小数都会舍去&#xff0c;都让他舍去了我们还讲个P&#xff0c;所以接下来就是告诉你怎么不让他全都舍去。 先来试想一下如果这个数字是3.4&#xff0c;存到整数型变量里面是不是直接变成了3&#xff0c;那么我要是…...

Linux栈帧

相关寄存器&指令 寄存器 rax&#xff08;accumulator&#xff09;&#xff1a;return value rbx&#xff08;base&#xff09; rcx&#xff08;count&#xff09;&#xff1a;4st argument rdx&#xff08;data&#xff09;&#xff1a;3st argument rsi&#xff08;sour…...

【代码随想录day59】【C++复健】 47. 参加科学大会(dijkstra(堆优化版)精讲 );94. 城市间货物运输 I

前几天有些事情耽搁了&#xff0c;不过好在图论我完全不会&#xff0c;所以偷看代码思路也没有任何的心理负担&#xff0c;做起来反而相对独立思考更快一点点。 47. 参加科学大会&#xff08;dijkstra&#xff08;堆优化版&#xff09;精讲 &#xff09; 本来一开始以为这个堆…...

【网络安全】WIFI WPA/WPA2协议:深入解析与实践

WIFI WPA/WPA2协议&#xff1a;深入解析与实践 1. WPA/WPA2 协议 1.1 监听 Wi-Fi 流量 解析 WPA/WPA2 的第一步是监听 Wi-Fi 流量&#xff0c;捕获设备与接入点之间的 4 次握手数据。然而&#xff0c;设备通常不会频繁连接或重新连接&#xff0c;为了加速过程&#xff0c;攻…...

穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集

题目&#xff1a; 两个方法本质就是决策树的画法不同 方法一解析&#xff1a; 代码&#xff1a; class Solution {private List<List<Integer>> ret;//返回结果private List<Integer> path;//记录路径&#xff0c;注意返回现场public List<List<Int…...

试题转excel;word转excel;大风车excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…...

Unity NTPComponent应用, 实现一个无后端高效获取网络时间的组件

无后端高效获取网络时间的组件 废话不多说&#xff0c;直接上源码m_NowSerivceTime 一个基于你发行游戏地区的时间偏移&#xff0c; 比如北京时区就是 8, 巴西就是-3&#xff0c;美国就是-5using Newtonsoft.Json; 如果这里报错&#xff0c; 就说明项目没有 NewtonsoftJson插件…...

复合机器人为生产提供精准的建议和决策支持

在现代化生产的浪潮中&#xff0c;智能复合机器人以其卓越的性能和高度智能化特点&#xff0c;正成为保障生产安全与可靠性的重要力量。 智能复合机器人具备精确的感知、判断和决策能力&#xff0c;能够在复杂的生产环境中自主导航、精确操作&#xff0c;避免了人为因素可能导致…...

springboot/ssm二手儿童绘本交易系统Java代码编写web项目闲置书籍源码

springboot/ssm二手儿童绘本交易系统Java代码编写web项目闲置书籍源码 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java package com.controller;import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map;import javax.s…...

30. Three.js案例-绘制并渲染圆弧

30. Three.js案例-绘制并渲染圆弧 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&#xff…...

类和对象(2)

大家好&#xff0c;今天我们继续来学习类和对象的知识&#xff0c;那么今天我们来看看类的概念和类的定义相关的知识&#xff0c;那么话不多说&#xff0c;我们直接开始。 2.类定义和使用 面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机&#xff0c;但是…...

240004基于ssm+maven+mysql+Java的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…...

HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别

在为您的应用程序选择通信协议时&#xff0c;有很多不同的选择。 本文将了解四种流行的解决方案&#xff1a;HTTP、WebSocket、gRPC 和 WebRTC。 我们将通过深入学习其背后原理、最佳用途及其优缺点来探索每个协议。 通信方式在不断改进&#xff1a;变得更快、更方便、更可靠&…...

FlowNex 中的两相建模基础知识

通过 FlowNex 中的两相建模解开高效流体动力学的秘密&#xff0c;彻底改变制造业。 挑战 两相流是指两个不同相&#xff08;通常是液体和气体&#xff09;同时流动&#xff0c;它们具有不同的特性和行为。在制造业中&#xff0c;了解两相流对于优化热交换器、化学反应器和流体…...

Mysql笔记

windows安装记录Windows中Mysql安装-CSDN博客 用到的库 通过网盘分享的文件&#xff1a;atguigudb.sql 链接: https://pan.baidu.com/s/1YfC20c2vK9odn-XRJJwUJw 提取码: utk7 --来自百度网盘超级会员v5的分享 Mysql4中表关联关系 1.1对1,比较少用,因为完全可以一张表,当有…...

docker拉取rabbitmq镜像安装延迟队列插件

我这里使用的是rabbitmq:3.12.0-management版本作为示例 1.拉取rabbitmq镜像 docker pull rabbitmq:3.12.0-management 2.启动rabbitmq docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.12.0-management 在咱们拉取时如果出现连接超时可…...

创建一个谷歌插件项目dome上线流程+源码

创建一个简单的 Chrome 扩展程序&#xff0c;其主要功能是 JSON 格式化。用户可以通过点击扩展图标打开一个弹出窗口&#xff0c;在弹出窗口中输入或粘贴 JSON 数据&#xff0c;然后点击格式化按钮来格式化 JSON 数据 谷歌插件&#xff08;即 Chrome 扩展程序&#xff09;主要设…...

举例说明如何在linux下检测摄像头设备具备的功能

假设摄像头设备文件为/dev/video1 &#xff0c;下面是一个专门用于检测 /dev/video1 设备能力的简化程序。这个程序将打印出设备的所有能力、格式和其他相关信息&#xff0c;以帮助你了解设备支持的功能。 检测 /dev/video1 设备能力的程序 #include <fcntl.h> #includ…...

win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录

win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09;实际操作记录 参考教程 : win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09; - 一佳一 - 博客园 开启虚拟机服务的 以管理员方式运行PowerShell运行命令。 &#xf…...

东北大学《2024年839自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《东北大学839自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

5G中的ATG Band

Air to Ground Networks for NR是R18 NR引入的。ATG很多部分和NTN类似中的内容类似。比较明显不同的是&#xff0c;NTN的RF内容有TS 38.101-5单独去讲&#xff0c;而ATG则会和地面网络共用某些band&#xff0c;这部分在38.101-1中有描述。 所以会存在ATG与地面网络之间的相邻信…...

nginx负载均衡配置

目录 一、简介 二、nginx下载 二、nginx配置 四、注意点 (1)/api与/api/的区别 (2)http://gatewayserver与http://gatewayserver/的区别 一、简介 Nginx&#xff08;发音为 "engine-x"&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMA…...

【教学类-83-02】20241214立体书三角嘴2.0——青蛙(扁菱形嘴)

背景需求&#xff1a; 制作小鸡立体贺卡三角嘴&#xff0c;它的嘴是正菱形&#xff08;四条边长度相等&#xff0c;类似正方形&#xff09; 【教学类-83-01】20241215立体书三角嘴1.0——小鸡&#xff08;正菱形嘴&#xff09;-CSDN博客文章浏览阅读744次&#xff0c;点赞22次…...

vscode设置终端代理

转载请标明出处&#xff1a;小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…...

【C++】函数计算题解论

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;思路解析3.1 函数的递归定义3.2 边界条件控制3.3 记忆化搜索 &#x1f4af;C实现代码&#x1f4af;添加解释&#x1f4af;小结 &#x1f4af;前言 在…...

Redis篇-21--运维篇3-集群(分片,水平扩展,高可用,集群配置案例,扩展哨兵案例)

1、概述 Redis集群&#xff08;Cluster&#xff09;通过分片&#xff08;sharding&#xff09;实现了水平扩展&#xff0c;允许数据分布在多个节点上&#xff0c;从而提升性能和存储容量。 在Redis集群中&#xff0c;数据被分割成16384个哈希槽&#xff08;hash slots&#x…...

Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材

注明&#xff1a;网络素材&#xff0c;仅供学习使用&#xff01; https://download.csdn.net/download/elineSea/90017291...

深入理解addEventListener中的第二个参数:listener

起因 首先&#xff0c;之前留给我们的一点东西&#xff0c;js的深入内容关键在addEventListener&#xff0c;这个函数中的参数&#xff0c;它们三个参数&#xff0c;分别为type、listener、options&#xff0c;当然在这里还有一些小的问题&#xff0c;比如mdn文档中它介绍到了另…...

数据库镜像(Database Mirroring):高可用性与灾难恢复技术

一、引言 在现代信息系统中&#xff0c;数据的可用性和完整性至关重要&#xff0c;尤其是对金融、电商、医疗等高并发和高可靠性要求的行业。数据库镜像&#xff08;Database Mirroring&#xff09; 作为一种高可用性与灾难恢复技术&#xff0c;通过将主数据库的数据实时复制到…...

【Qt】按钮类控件:QPushButton、QRadioButton、QCheckBox、ToolButton

目录 QPushButton 例子&#xff1a; QRadioButton 例子&#xff1a; 按钮的常见信号函数 单选按钮分组 例子&#xff1a; QCheckButton 例子&#xff1a; QToolButton QWidget的常见属性及其功能对于它的派生类控件都是有效的(也就是Qt中的各种控件)&#xff0c;包括…...

day-21 内核链表以及栈

1.昨日作业 1.删除指定节点 找到删除就完事了&#xff0c;双向可以停在删除处。 /***************************** 功能&#xff1a;删除指定结点&#xff08;通过姓名&#xff09;* 参数&#xff1a;phead&#xff1b;oldname; * 返回&#xff1a;成功0&#xff0c;失-1&…...

深度与视差的关系及其转换

深度与视差的关系及其转换 在计算机视觉和立体视觉中&#xff0c;深度和视差是两个重要的概念。理解这两者之间的关系对于实现立体图像处理、三维重建以及深度估计至关重要。在这篇博客中&#xff0c;我们将深入探讨深度和视差的概念&#xff0c;并介绍它们之间的转换关系。 …...

Unity全局光照详解

之前就学过但是太久没用又忘了&#xff0c;因此用最简洁易懂的语言做个记录。 全局光照分为两个系统&#xff0c;分别是实时光照和混合光照。&#xff08;点击window/Rendering/Lighing打开此面板&#xff09; 其中全局光照对于我来说都是新技术了&#xff0c;上一次学…...

外观模式的理解和实践

外观模式&#xff08;Facade Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。该模式定义了一个高层的接口&#xff0c;使得子系统更容易使用。简单来说&#xff0c;外观模式就是通过引入一个外观角色…...

【前端知识】Javascript进阶-类和继承

文章目录 概述一、类&#xff08;Class&#xff09;二、继承&#xff08;Inheritance&#xff09; 三、继承的实现方式作用一、类和作用二、继承和作用 概述 当然可以&#xff0c;以下是对JavaScript中类和继承的详细介绍&#xff1a; 一、类&#xff08;Class&#xff09; 定…...

Kylin麒麟操作系统 | Nginx服务部署

目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器&#xff…...

51单片机--- 串口控制仿真

51单片机--- 串口控制仿真 实验目标:51单片机接收串口数据,根据数据点亮LED。 实验步骤: 在Proteus里画出原理图 在Keil里用C语言编写程序 在Proteus中导入HEX文件,启动仿真 实验协议: 波特率115200 数据位:8位,停止位:1位,校验位:无。 命令格式: 一条命令为…...

<数据集>输电线塔杂物识别数据集<目标检测>

数据集下载链接 &#xff1c;数据集&#xff1e;输电线塔杂物识别数据集&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90141102数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1099张 标注数量(xml文件个数)&#xff1a;1099 …...

HarmonyOS学习 --- Mac电脑获取手机UDID

一&#xff0c;手机打开开发者选项 1&#xff0c;打开“设置 > 关于本机”&#xff0c;连续点击7次版本号&#xff0c;打开开发者选项。 2&#xff0c;打开“USB调试”。 二&#xff0c;配置环境变量 获取OpenHarmony SDK 安装路径 /Users/admin/Library/OpenHarmony/Sdk/10…...

OpenIPC开源FPV之Adaptive-Link地面站代码解析

OpenIPC开源FPV之Adaptive-Link地面站代码解析 1. 源由2. 框架代码3. 软件配置3.1 默认配置3.2 加载配置3.3 更新配置 4. 通信例程4.1 TCP报文解析4.2 UDP报文发送 5. 特殊指令5.1 request_keyframe5.2 drop_gop5.3 resume_adaptive5.4 pause_adaptive 6. 总结7. 参考资料 1. 源…...

Linux Docker环境中解决中文字体乱码问题完整指南

问题背景 在Linux Docker环境中运行涉及中文显示的应用时&#xff08;如Selenium网页截图、PDF生成等&#xff09;&#xff0c;经常会遇到中文显示为方块或乱码的问题。这是因为Linux系统默认没有安装中文字体所导致的。 解决方案 我们可以从Windows系统复制常用中文字体到D…...

[数据结构#1] 并查集 | FindRoot | Union | 优化 | 应用

目录 1. 并查集原理 问题背景 名称与编号映射 数据结构设计 2. 并查集基本操作 (1) 初始化 (2) 查询根节点 (FindRoot) (3) 合并集合 (Union) (4) 集合操作总结 并查集优化 (1) 路径压缩 (2) 按秩合并 3. 并查集的应用 (1) 统计省份数量 (2) 判断等式方程是否成…...

用于卫星影像间接RPC模型精化的通用光束法平差方法

引言 介绍了通用RPC模型的表达式&#xff0c;which has been down to death 描述了RPC模型产生误差的原因——主要与定义传感器方位的姿态角有关。 每个影像都会对应一个三维点云&#xff0c;但是对同一地物拍摄的不同影像对应出来的三维点云是不一样的&#xff0c;所以才需…...

关于Redis主从复制实验操作

需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; Redis主从复制需要一主二从&#xff08;共三个Redis…...

【HarmonyOS】鸿蒙获取appIdentifier,Identifier

【HarmonyOS】鸿蒙获取appIdentifier&#xff0c;Identifier 一、前言 三方后台需要填写的所谓appIdentifier&#xff0c;Identifier信息&#xff0c;其实对应鸿蒙应用的appID。 二、解决方案&#xff1a; 注意&#xff0c;模拟器获取data.signatureInfo.appIndentifer为空…...