Spring OAuth2:开发者的安全盾牌!(上)
何利用Spring OAuth2构建坚不可摧的安全体系?如何使用 OAuth2 从跨域挑战到性能优化,每一个环节都为你的应用保驾护航?
文章目录
- Spring OAuth2 详解
- 1. 引言
- 简述OAuth2协议的重要性
- Spring Framework对OAuth2的支持概述
- 2. 背景介绍
- 2.1 OAuth2协议基础
- 协议发展历程
- 四种授权模式概述
- 2.2 Spring Security与OAuth2集成
- Spring Security的作用
- OAuth2在Spring生态中的位置
- 3. OAuth2核心组件
- 3.1 资源所有者
- 用户与授权过程
- 3.2 客户端
- 公开、保密客户端区别
- 3.3 授权服务器
- 功能与职责
- 令牌类型介绍
- 3.4 保护资源服务器
- 如何验证访问令牌
- 4. 实现授权码模式
- 4.1 流程解析
- 请求授权码
- 交换令牌
- 访问受保护资源
- 4.2 Spring配置示例
- 定义安全配置
- 配置授权与令牌端点
- 5. 简化模式与隐式授权
- 5.1 适用场景对比
- 简化模式特点
- 隐式授权风险
- 5.2 实践指导
- 配置调整与实现要点
Spring OAuth2 详解
1. 引言
想象一下,你是一个在数字世界中的冒险者,你有一个宝箱,里面装满了你的个人数据和应用权限。这个宝箱非常珍贵,你不想随便让人打开。但是,你需要与朋友分享一些宝物,比如你的相册或者你的游戏分数。这时候,OAuth2协议就像是一个聪明的管家,它可以帮助管理谁可以访问你的宝箱,以及访问的权限有多大。
简述OAuth2协议的重要性
OAuth2协议就像是数字世界中的一把钥匙,它允许用户授权第三方应用访问他们的数据,而无需分享他们的用户名和密码。这就像是一个信任的桥梁,连接用户、应用和数据。它的重要性在于:
- 安全性:保护用户的账户信息,避免直接暴露敏感数据。
- 灵活性:支持多种授权模式,适应不同的应用场景。
- 扩展性:允许第三方应用在用户授权的情况下,访问和操作用户数据。
Spring Framework对OAuth2的支持概述
Spring Framework,这个强大的后端开发框架,对OAuth2的支持就像是给这个宝箱加上了一把高科技的锁。Spring Security是一个全面的安全框架,它与OAuth2的集成使得在Spring应用中实现安全、灵活的授权变得简单。
- 集成:Spring Security提供了与OAuth2协议的无缝集成。
- 简化:通过Spring的配置和注解,简化了OAuth2的实现过程。
- 扩展:支持自定义扩展,以满足特定需求。
想象一下,你是一个开发者,你正在构建一个应用,你需要确保用户数据的安全,同时也要让其他应用能够安全地访问这些数据。OAuth2和Spring Security的结合,就像是给你的数字宝箱加上了一把智能锁,让你可以轻松管理谁可以访问,以及访问的权限有多大。
这就是为什么OAuth2协议和Spring Framework对它的支持如此重要。它们不仅保护了用户的隐私,还为开发者提供了一个强大而灵活的工具,以构建安全、可靠的应用程序。接下来,我们将深入探讨OAuth2的背景和核心组件,以及如何在Spring中实现它。准备好了吗?让我们开始这段有趣的旅程吧!
2. 背景介绍
2.1 OAuth2协议基础
在数字世界的冒险旅程中,我们来到了一个叫做OAuth2的神秘岛屿。这个岛屿上,有一个古老的协议,它帮助保护着岛上居民的宝贵资源。这个协议,就是OAuth2。
协议发展历程
OAuth2协议的诞生,可以追溯到一个叫做OAuth1的前辈。OAuth1是一个强大的守护者,但它有点复杂,使用起来不太方便。随着时间的推移,岛上的居民们需要一个更简单、更灵活的方式来保护他们的资源。于是,OAuth2诞生了,它不仅继承了前辈的优点,还加入了更多的创新和灵活性。
四种授权模式概述
OAuth2协议有四种授权模式,就像是岛上的四种不同的守护兽,每种都有其独特的能力:
- 授权码模式:这是最常用的守护兽,它通过一个安全的中间人(授权服务器)来交换访问令牌。
- 简化模式:这个守护兽适合快速简单的任务,它直接在URL中传递令牌,但要小心,因为它可能会暴露令牌。
- 密码模式:这个守护兽信任用户,允许用户直接提供他们的凭证来获取令牌。
- 客户端凭证模式:这个守护兽是为岛上的内部服务设计的,它允许服务之间直接使用客户端ID和密钥来交换令牌。
2.2 Spring Security与OAuth2集成
现在,让我们转向另一个强大的盟友——Spring Security。Spring Security是一个全面的安全框架,它与OAuth2的集成,就像是给岛上的居民提供了一个更加强大的保护系统。
Spring Security的作用
Spring Security的作用就像是岛上的守护神,它保护着岛上的居民和他们的资源不受外来侵害。它提供了:
- 认证:确保访问者是他们声称的那个人。
- 授权:确保访问者有权限访问他们请求的资源。
OAuth2在Spring生态中的位置
OAuth2在Spring生态中的位置,就像是岛上的守护塔,它连接着Spring Security和岛上的居民。通过Spring Security的OAuth2支持,开发者可以:
- 轻松实现:通过Spring的配置和注解,简化OAuth2的实现。
- 高度定制:根据需要定制授权流程和令牌管理。
- 无缝集成:与Spring的其他安全特性无缝集成,如CSRF保护、会话管理等。
通过这个集成,开发者可以构建既安全又灵活的应用,保护用户的资源,同时允许第三方应用在用户授权的情况下访问这些资源。这就像是在数字世界中的冒险旅程中,找到了一个既强大又可靠的伙伴,帮助我们安全地探索未知的领域。
现在,我们已经了解了OAuth2协议的背景和它在Spring生态中的位置。接下来,我们将深入探讨OAuth2的核心组件,以及如何在Spring中实现它。准备好了吗?让我们继续这段旅程,探索更多的秘密吧!
3. OAuth2核心组件
3.1 资源所有者
想象一下,你是一个拥有丰富宝藏的海盗船长,你的宝藏就是你的个人数据。在OAuth2的世界里,你就是资源所有者。你的宝藏被锁在一个安全的箱子里,只有你才能决定谁可以打开它。
用户与授权过程
当你想分享你的宝藏(数据)给其他海盗(第三方应用)时,你不会直接给他们钥匙(用户名和密码)。相反,你给他们一张藏宝图(授权码),他们可以用这张图来找到你的宝藏守护者(授权服务器),并从守护者那里得到进入宝藏箱的钥匙(访问令牌)。
3.2 客户端
在这个故事中,客户端就像是那些想要访问你宝藏的海盗。他们需要你的允许才能拿到宝藏。
公开、保密客户端区别
- 公开客户端:这些是那些在开放海域(公共环境)中的海盗,他们不能保守秘密。因此,他们的客户端密钥(如果他们有的话)不能保密,可能会被任何人看到。
- 保密客户端:这些海盗在他们的船舱里(安全环境)操作,他们可以保守秘密。他们的客户端密钥是保密的,只有他们自己知道。
3.3 授权服务器
授权服务器是这个故事中的宝藏守护者。他们负责管理谁可以访问宝藏。
功能与职责
授权服务器的职责包括:
- 验证请求:确保请求访问宝藏的海盗是经过资源所有者(你)授权的。
- 发放令牌:一旦验证通过,授权服务器会给海盗发放访问宝藏的钥匙(访问令牌)。
令牌类型介绍
授权服务器会发放几种不同类型的钥匙:
- 访问令牌:这是进入宝藏箱的主要钥匙。
- 刷新令牌:这是一种特殊的钥匙,可以在访问令牌过期后用来获取新的访问令牌,而不需要再次进行完整的授权过程。
3.4 保护资源服务器
保护资源服务器是宝藏箱本身,它需要确保只有持有正确钥匙的人才能打开它。
如何验证访问令牌
当一个海盗(客户端)带着钥匙(访问令牌)来到宝藏箱前,保护资源服务器会:
- 检查令牌:确保令牌是有效的,没有过期,且是由授权服务器发放的。
- 验证权限:确保令牌对应的权限允许海盗访问他们请求的宝藏部分。
例子:
假设你有一个在线相册应用,用户(资源所有者)想要通过第三方应用分享他们的相册。用户会通过你的应用(授权服务器)授权第三方应用。你的应用会发放一个访问令牌给第三方应用,第三方应用随后可以使用这个令牌来访问用户的相册(受保护的资源)。
代码示例:
// 用户请求访问令牌
@GetMapping("/authorize")
public String authorizeUser(@RequestParam("client_id") String clientId,@RequestParam("redirect_uri") String redirectUri,@RequestParam("response_type") String responseType,HttpSession session) {// 验证客户端ID等信息...// 假设用户同意授权session.setAttribute("client_id", clientId);return "redirect:" + redirectUri + "?code=some_auth_code";
}// 第三方应用使用授权码交换访问令牌
@PostMapping("/token")
public ResponseEntity<?> getAccessToken(@RequestBody MultiValueMap<String, String> requestBody,HttpServletRequest request) {// 验证授权码、客户端ID和密钥...// 发放访问令牌return ResponseEntity.ok(new AccessToken("access_token", "refresh_token", "user_id"));
}
在这段代码中,我们创建了两个简单的端点:一个用于用户授权,另一个用于使用授权码交换访问令牌。这只是一个简化的例子,实际应用中会有更多的安全检查和复杂逻辑。
通过这些核心组件,OAuth2协议确保了用户数据的安全和合理的访问控制。在下一章中,我们将深入探讨如何实现授权码模式,并提供更多的代码示例和实践指导。准备好了吗?让我们继续这段有趣的旅程!
4. 实现授权码模式
4.1 流程解析
在OAuth2的冒险故事中,授权码模式就像是一场精心设计的寻宝游戏。在这个游戏中,海盗们(客户端)需要通过一系列的步骤来获取宝藏(受保护的资源)。
请求授权码
第一步,海盗们需要向宝藏守护者(授权服务器)请求一张藏宝图(授权码)。他们需要提供一些信息,比如他们是谁(客户端ID),他们想要访问的宝藏(资源所有者的同意),以及他们成功获取宝藏后应该去哪里(重定向URI)。
这个过程可以用以下步骤概括:
- 客户端重定向用户:客户端将用户重定向到授权服务器的授权端点。
- 用户登录:用户在授权服务器上登录并验证自己的身份。
- 授权同意:用户同意授权客户端访问他们的资源。
- 授权服务器发放授权码:如果用户同意,授权服务器将发放一个授权码给客户端。
交换令牌
第二步,海盗们(客户端)拿着藏宝图(授权码)回到宝藏守护者那里,请求换取真正的钥匙(访问令牌)。
这个过程包括:
- 客户端发送授权码:客户端将授权码发送到授权服务器的令牌端点。
- 授权服务器验证授权码:授权服务器验证授权码的有效性。
- 发放访问令牌:如果授权码有效,授权服务器发放访问令牌和刷新令牌。
访问受保护资源
最后一步,海盗们拿着真正的钥匙(访问令牌)来到宝藏箱(受保护资源服务器)前,展示他们的钥匙以访问宝藏。
- 客户端发送访问令牌:客户端将访问令牌发送到受保护资源服务器。
- 受保护资源服务器验证访问令牌:服务器验证访问令牌的有效性。
- 提供资源:如果访问令牌有效,服务器提供请求的资源。
4.2 Spring配置示例
现在,让我们用Spring的语言来编写这个故事,看看如何配置授权码模式。
定义安全配置
首先,我们需要定义一个安全配置,告诉Spring如何保护我们的宝藏。
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {// 省略了其他配置,比如数据库连接、客户端详情服务等@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authorizationCodeServices(new AuthorizationCodeServices()).tokenStore(tokenStore())// 其他配置...;}// 配置授权码服务、令牌存储等
}
配置授权与令牌端点
接下来,我们需要配置授权端点和令牌端点,这样海盗们就知道如何请求藏宝图和真正的钥匙。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/authorize**").permitAll() // 授权端点对所有人开放.anyRequest().authenticated() // 其他请求需要认证.and().oauth2Login() // 配置OAuth2登录.and()// 其他配置...;}
}
在这个配置中,我们告诉Spring哪些端点是公开的(比如授权端点),哪些需要用户认证。我们还配置了OAuth2登录,这样用户就可以登录并授权访问他们的资源。
例子:
假设你正在构建一个在线图书馆应用,用户可以借阅电子书。第三方应用(比如一个阅读统计应用)想要访问用户的借阅历史。用户通过你的应用授权第三方应用,第三方应用使用授权码模式来获取访问令牌,并访问用户的借阅历史。
代码示例:
// 用户访问授权端点
@GetMapping("/authorize")
public String authorize(@RequestParam("response_type") String responseType,@RequestParam("client_id") String clientId,@RequestParam("redirect_uri") String redirectUri,@RequestParam("scope") String scope,HttpSession session) {// 这里会进行用户认证和授权同意的逻辑// 发放授权码return "redirect:" + redirectUri + "?code=some_auth_code";
}// 客户端使用授权码交换访问令牌
@PostMapping("/token")
public ResponseEntity<?> exchangeForAccessToken(@RequestBody MultiValueMap<String, String> parameters,HttpServletRequest request) {// 验证授权码,发放访问令牌AccessToken accessToken = new AccessToken("access_token", "refresh_token", "user_id");return ResponseEntity.ok(accessToken);
}
在这些代码示例中,我们创建了授权端点和令牌端点,用户可以通过这些端点进行授权和交换访问令牌。这些只是简化的示例,实际应用中会有更多的安全检查和复杂逻辑。
通过这些步骤和配置,我们就可以在Spring中实现授权码模式,确保用户资源的安全访问。在下一章中,我们将探讨简化模式与隐式授权,看看它们是如何工作的,以及它们适用的场景。准备好了吗?让我们继续这段寻宝之旅!
5. 简化模式与隐式授权
5.1 适用场景对比
在OAuth2的世界里,除了授权码模式这个寻宝游戏,还有两种更简单、更直接的方式,那就是简化模式和隐式授权。
简化模式特点
简化模式就像是一张快速通行证,它允许海盗们(客户端)在不需要宝藏守护者(授权服务器)的情况下,直接从用户(资源所有者)那里获取访问令牌。这种方式适合于那些海盗们已经获得了用户信任的情况。
- 适用场景:用户与客户端之间有高度信任,例如,客户端是用户自己的设备上的应用程序。
- 优点:流程简单,不需要服务器间的交互。
- 缺点:访问令牌可能会在不安全的环境中传输,增加了安全风险。
隐式授权风险
隐式授权就像是一张没有经过宝藏守护者验证的藏宝图,海盗们可以直接使用这张图来获取宝藏。这种方式虽然方便,但也存在一些风险。
- 适用场景:适用于客户端无法安全存储客户端密钥的情况,如纯前端应用。
- 风险:访问令牌可能会在URL中暴露,增加了被截获的风险。
5.2 实践指导
配置调整与实现要点
在使用简化模式或隐式授权时,我们需要对Spring Security的配置进行一些调整,以适应这些模式的特点。
配置示例:
@Configuration
public class OAuth2Config extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()// 允许所有用户访问简化模式和隐式授权的端点.antMatchers("/login", "/oauth2/authorize").permitAll().anyRequest().authenticated().and().oauth2Login().and()// 其他配置...;}
}
在这个配置中,我们允许所有用户访问登录和授权端点,这些端点是简化模式和隐式授权的关键部分。
例子:
假设你正在构建一个社交媒体应用,用户可以通过他们的智能手表(一个没有服务器端点的客户端)来发布状态更新。在这种情况下,简化模式就非常合适,因为智能手表可以安全地存储访问令牌,并且用户对其有高度信任。
代码示例:
// 用户登录并授权客户端
@GetMapping("/login")
public String login(@RequestParam("client_id") String clientId,@RequestParam("response_type") String responseType,@RequestParam("redirect_uri") String redirectUri,HttpSession session) {// 用户登录逻辑...// 假设用户已登录并授权session.setAttribute("client_id", clientId);return "redirect:" + redirectUri + "?access_token=some_access_token&token_type=bearer";
}// 客户端直接从响应中获取访问令牌
// 这通常在客户端的JavaScript代码中处理
在简化模式中,客户端直接从用户那里获取访问令牌,而不需要通过授权服务器。这种方式简化了流程,但需要确保客户端能够安全地处理访问令牌。
通过这些配置和实践指导,我们可以在Spring中实现简化模式和隐式授权,同时注意它们的适用场景和潜在风险。在下一章中,我们将探讨客户端凭证模式和密码模式,这两种模式适用于不同的场景,并且有其独特的实现方式。准备好了吗?让我们继续这段OAuth2的冒险旅程!
踏上这段激动人心的数字探险,我们像探险家一样,揭开了OAuth2协议的神秘面纱,探索了Spring Framework如何巧妙地与它融合。我们穿梭在授权的海洋中,发现了资源所有者、客户端、授权服务器和保护资源服务器这些角色的秘密,它们共同编织了一场华丽的舞会。跟随授权码模式的地图,我们像海盗一样寻找宝藏,一步步解锁了令牌的奥秘。而在简化模式与隐式授权的钢丝上,我们体验了速度与风险的双重游戏。
但这只是冰山一角,我们的旅程才刚刚开始。接下来的路途中,更多未知的挑战和深层的秘密正等着我们去发掘。深入授权模式的迷宫,探索高级安全策略的堡垒,甚至可能遇到一些出人意料的陷阱和难题。系紧你的冒险装备,保持你的好奇心,继续跟随我们的指南针,因为在这段探险的下一个转角,总有新的惊喜在等待着勇敢的你!
相关文章:

Spring OAuth2:开发者的安全盾牌!(上)
何利用Spring OAuth2构建坚不可摧的安全体系?如何使用 OAuth2 从跨域挑战到性能优化,每一个环节都为你的应用保驾护航? 文章目录 Spring OAuth2 详解1. 引言简述OAuth2协议的重要性Spring Framework对OAuth2的支持概述 2. 背景介绍2.1 OAuth2…...

设计模式使用(成本扣除)
前言 名词解释 基础名词 订单金额:用户下单时支付的金额,这个最好理解 产品分成:也就是跟其他人合做以后我方能分到的金额,举个例子,比如用户订单金额是 100 块,我方的分成是 80%,那么也就是…...
输入输出(2)——C++的标准输出流
目录 一、C的标准输出流 (一)cout、cerr和clog流对象 1、cout 流对象 2、cerr 流对象 3、clog流对象 (二)用函数put输出字符 (三)用函数 write 输出字符 一、C的标准输出流 标准输出流——流向标准输…...

C语言序列化和反序列化--TPL(一)
TPL TPL说明网站 C语言中高效的序列化 您可以使用tpl快速轻松地存储和重新加载C数据。Tpl是一个用于序列化C数据的库。数据以自然二进制形式存储。该API很小,并试图保持“不碍事”。Tpl可以序列化许多C数据类型,包括结构。Tpl与文件、内存缓冲区和文件…...
Session + JWT + Cookie
00:HTTP无状态(为了保持状态,前端好麻烦,又要自己存,又要想办法带出去,于是使用cookie) 01:Cookie 将用户信息,在每次请求时候 带给后端(但是自己存储大小有…...

PaddleOCR2.7+Qt5
章节一:Windows 下的 PIP 安装 官网安装教程地址 按照里面的教程去安装 如果使用cuda版本的还要安装tensorrt,不然后面运行demo程序的程序会报如下错。 下载TensorRT 8版本,tensorrt下载地址 章节二:编译源码 进入官网源码地址 下…...

在Android中解析XML文件并在RecyclerView中显示
1. 引言 最近工作有解析外部xml文件在App中显示的需求,特来写篇文章记录一下,方便下次使用。 2. 准备工作 首先,在项目的AndroidManifest.xml文件中添加读取外部存储的权限声明。 <uses-permission android:name"android.permiss…...

Notes for video: EDC-Con 2022/01 - EDC Conceptual Overview and Architecture
Eclipse Dataspace Connector 中文概念 Eclipse Dataspace Connector (EDC) 是一个开源项目,旨在提供一种标准化的方法来连接和共享数据空间中的数据。它是 Eclipse Foundation 下的一个项目,目标是促进数据共享和数据交换的互操作性。以下是 EDC 的一些…...
windows下nginx配置https证书
1、制作证书 1.1 安装工具openSSL。下载地址:http://slproweb.com/products/Win32OpenSSL.html Win64OpenSSL_Light-3_1_0.exe安装(假定安装位置在 d:\openSSL\) 1.2 配置openSSL环境。 新建系统变量OpenSSL值为d:\openSSL\bin,相…...

Llama改进之——RoPE旋转位置编码
引言 旋转位置编码(Rotary Position Embedding, RoPE)将绝对相对位置依赖纳入自注意力机制中,以增强Transformer架构的性能。目前很火的大模型LLaMA、QWen等都应用了旋转位置编码。 之前在[论文笔记]ROFORMER中对旋转位置编码的原始论文进行了解析,重点…...

Python的解析网页
课前案例 通过requests模块爬取指定网站中的图片并保存到本地目录中。 上述案例采用的是同步方式下载图片,效率太低。异步方式如下(线程): # target为目标函数;args中传入的是download函数的参数url threading.Threa…...

VBA技术资料MF159:实现某个区域内的数据滚动
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...

开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述
1. 文档管理系统是什么 文档管理系统(DMS:Document Management System)是一种软件系统,用于组织、存储、检索和管理电子文档和文件。这些文件可以是各种格式的电子文档,如文本文档、电子表格、图像、音频或视频文件等…...
lambda函数实践
文章目录 1.简单实例2.lambda函数使用3.捕获列表的使用4.lambda表达式的应用1.简单实例 2.lambda函数使用 3.捕获列表的使用 4.lambda表达式的应用 #include <iostream> #include <vector>using namespace std;/** 1.简单实例* 2.lambda函数使用* 3.捕获列表的…...

[leetcode hot 150]第一百九十一题,位1的个数
题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中设置位的个数(也被称为汉明重量)。 这道题比较简单,直接对最后一位进行与1的与操作,然…...

gitea的git库备份与恢复
文章目录 gitea库的备份与恢复概述笔记实验环境更新git for windows更新 TortoiseGit备份已经存在的gitea的git库目录使用gitea本身来备份所有git库目录将gitea库恢复到新目录m1m2m3启动gitea - 此时已经恢复完成FETCH_HEAD 中有硬写位置再查一下app.ini, 是否改漏了。m1m2 总结…...
【强化学习05】从Q学习到深度Q学习
深度Q学习(Deep Q-Learning, DQN)是将深度学习与Q学习结合起来的一种强化学习方法,利用神经网络来近似Q值函数,解决传统Q学习在大规模或连续状态空间中的局限性。下面详细解释DQN的机理。 背景知识 Q学习 Q学习是一种值函数法&…...

FPGA实现多路并行dds
目录 基本原理 verilog代码 仿真结果 基本原理 多路并行dds,传统DDS的局限性在于输出频率有限。根据奈奎斯特采样定理,单路DDS的输出频率应小于系统时钟频率的一半。但是在很多地方,要使采样率保持一致,所以,为了…...

ArcgisPro3.1.5安装手册
ArcgisPro3.1.5安装手册 一、目录介绍: 二、安装教程: (1)安装顺序:最先安装运行环境(runtime6.0.5),接着安装install里面的文件,最后复制path里面的文件替换到软件bin文件夹下即可。 (2)具体安装步骤ÿ…...
三大主流框架
Web前端开发领域中,三大主流框架通常指的是: React:由Facebook开发的一个用于构建用户界面的JavaScript库。React以其组件化、声明式编程和虚拟DOM等特点而广受欢迎,能够高效地更新和渲染大型应用。 Vue.js:由尤雨溪创…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...