SpringSecurity OAuth2:授权服务器与资源服务器配置
文章目录
- 引言
- 一、OAuth2基础概念与架构
- 二、授权服务器配置
- 三、令牌策略与存储方式
- 四、资源服务器配置
- 五、远程令牌验证与内省
- 总结
引言
在现代分布式应用架构中,OAuth2已成为实现安全授权与认证的事实标准。Spring Security对OAuth2提供了全面支持,使开发者能够轻松实现标准兼容的授权服务器和资源服务器。尽管Spring Security OAuth项目已于2020年进入维护模式,由Spring Authorization Server项目接替,但其核心概念仍然适用。本文将深入探讨如何在Spring生态系统中配置OAuth2的授权服务器和资源服务器,包括客户端注册、授权类型配置、令牌管理以及资源保护策略。通过掌握这些配置要点,开发者可以构建安全、标准化的OAuth2实现,保障分布式系统中的服务和资源安全。
一、OAuth2基础概念与架构
OAuth2框架定义了四个关键角色:资源所有者(用户)、客户端应用、授权服务器和资源服务器。授权服务器负责认证用户身份并颁发访问令牌,资源服务器则负责验证令牌有效性并保护资源。Spring Security提供了实现这两类服务器的完整支持,使开发者能够以声明式方式定义OAuth2安全策略。在微服务架构中,通常一个中心化的授权服务负责整个系统的认证和授权,而多个资源服务则保护各自的API资源。理解这一架构是正确配置Spring Security OAuth2的基础。
// OAuth2核心组件关系示意图(代码表示)
public class OAuth2Architecture {// 授权服务器职责interface AuthorizationServer {// 验证客户端身份boolean authenticateClient(ClientDetails client);// 处理授权请求AuthorizationRequest processAuthorizationRequest(Principal user);// 颁发访问令牌OAuth2AccessToken issueAccessToken(AuthorizationRequest authorizationRequest);// 刷新令牌OAuth2AccessToken refreshAccessToken(String refreshToken);}// 资源服务器职责interface ResourceServer {// 验证访问令牌Authentication validateToken(String accessToken);// 检查权限boolean checkPermission(Authentication authentication, Object resource);// 提供受保护资源Object provideResource(Authentication authentication);}// 客户端应用interface Client {// 获取授权码String obtainAuthorizationCode();// 使用授权码交换访问令牌OAuth2AccessToken exchangeForAccessToken(String authorizationCode);// 访问资源Object accessResource(OAuth2AccessToken accessToken);}
}
二、授权服务器配置
授权服务器是OAuth2架构的核心,负责认证用户、验证客户端以及颁发令牌。在Spring Security中,通过继承AuthorizationServerConfigurerAdapter类并实现其配置方法来自定义授权服务器行为。关键配置包括:客户端详情服务(定义注册的客户端)、令牌服务(控制令牌生成和存储)、授权端点(处理授权请求的URL)以及安全策略(如支持的授权类型、令牌有效期等)。虽然Spring Authorization Server项目正逐步取代原有实现,但核心配置概念保持一致。
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Autowiredprivate AuthenticationManager authenticationManager;@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate DataSource dataSource;@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {// 配置客户端详情clients.jdbc(dataSource) // 使用数据库存储客户端信息.withClient("web-client") // 客户端ID.secret(passwordEncoder().encode("secret")) // 客户端密钥.authorizedGrantTypes("authorization_code", "refresh_token", "password") // 支持的授权类型.scopes("read", "write") // 允许的作用域.redirectUris("http://localhost:8080/callback") // 重定向URI.accessTokenValiditySeconds(3600) // 访问令牌有效期.refreshTokenValiditySeconds(86400) // 刷新令牌有效期.and().withClient("mobile-client").secret(passwordEncoder().encode("mobile-secret")).authorizedGrantTypes("authorization_code", "password", "refresh_token").scopes("read").redirectUris("com.example.app://oauth2callback").accessTokenValiditySeconds(1800).refreshTokenValiditySeconds(43200);}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {// 配置授权服务器端点endpoints.authenticationManager(authenticationManager) // 认证管理器.userDetailsService(userDetailsService) // 用户详情服务.tokenStore(tokenStore()) // 令牌存储方式.accessTokenConverter(accessTokenConverter()) // 令牌转换器.tokenEnhancer(tokenEnhancerChain()) // 令牌增强链.allowedTokenEndpointRequestMethods(HttpMethod.POST) // 允许的令牌端点请求方法.reuseRefreshTokens(false); // 刷新令牌时不复用原刷新令牌}@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {// 配置令牌端点的安全约束security.tokenKeyAccess("permitAll()") // 令牌密钥端点访问控制.checkTokenAccess("isAuthenticated()") // 令牌检查端点访问控制.allowFormAuthenticationForClients(); // 允许客户端使用表单认证}@Beanpublic TokenStore tokenStore() {// 使用JWT令牌存储return new JwtTokenStore(accessTokenConverter());}@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey("secret-key"); // 设置JWT签名密钥return converter;}@Beanpublic TokenEnhancerChain tokenEnhancerChain() {// 配置令牌增强链TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(customTokenEnhancer(), accessTokenConverter()));return tokenEnhancerChain;}@Beanpublic TokenEnhancer customTokenEnhancer() {// 自定义令牌增强器,添加额外信息到令牌return new CustomTokenEnhancer();}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}// 自定义令牌增强器
class CustomTokenEnhancer implements TokenEnhancer {@Overridepublic OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {Map<String, Object> additionalInfo = new HashMap<>();// 向令牌添加额外信息if (authentication.getPrincipal() instanceof UserDetails) {UserDetails user = (UserDetails) authentication.getPrincipal();additionalInfo.put("username", user.getUsername());// 可以添加其他用户信息}additionalInfo.put("organization", "example-org");additionalInfo.put("timestamp", new Date().getTime());((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);return accessToken;}
}
三、令牌策略与存储方式
OAuth2令牌是授权系统的核心,Spring Security提供了多种令牌存储策略,包括内存存储、数据库存储、Redis存储以及JWT(JSON Web Token)。JWT特别流行,因为它是自包含的,减少了后端存储需求。令牌策略配置包括令牌格式、有效期、刷新机制等。开发者可以通过TokenStore和TokenEnhancer接口自定义令牌的存储和增强逻辑,如添加额外的业务信息到令牌中。选择合适的令牌策略对系统性能和安全性有重要影响。
// 不同令牌存储策略的配置
@Configuration
public class TokenStoreConfig {@Autowiredprivate DataSource dataSource;@Autowiredprivate RedisConnectionFactory redisConnectionFactory;// 内存令牌存储@Bean@Profile("dev")public TokenStore inMemoryTokenStore() {return new InMemoryTokenStore();}// JDBC令牌存储@Bean@Profile("prod")public TokenStore jdbcTokenStore() {return new JdbcTokenStore(dataSource);}// Redis令牌存储@Bean@Profile("cluster")public TokenStore redisTokenStore() {return new RedisTokenStore(redisConnectionFactory);}// JWT令牌存储@Bean@Profile("jwt")public TokenStore jwtTokenStore() {return new JwtTokenStore(jwtAccessTokenConverter());}@Bean@Profile("jwt")public JwtAccessTokenConverter jwtAccessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();// 对称密钥签名converter.setSigningKey("secret-signing-key");// 非对称密钥签名(更安全)// KeyPair keyPair = new KeyStoreKeyFactory(// new ClassPathResource("keystore.jks"), "password".toCharArray()// ).getKeyPair("alias");// converter.setKeyPair(keyPair);return converter;}// 自定义令牌服务,控制令牌生成策略@Beanpublic DefaultTokenServices tokenServices(TokenStore tokenStore) {DefaultTokenServices tokenServices = new DefaultTokenServices();tokenServices.setTokenStore(tokenStore);tokenServices.setSupportRefreshToken(true);tokenServices.setAccessTokenValiditySeconds(3600); // 1小时tokenServices.setRefreshTokenValiditySeconds(86400); // 1天return tokenServices;}
}
四、资源服务器配置
资源服务器保护应用的API资源,确保只有持有有效令牌的请求才能访问。在Spring Security中,通过@EnableResourceServer注解和继承ResourceServerConfigurerAdapter来配置资源服务器。关键配置包括资源ID(标识受保护的资源集合)、令牌服务(验证令牌的有效性)、资源访问规则(定义URL级别的保护策略)以及异常处理(如处理令牌无效或过期的情况)。资源服务器通常需要与授权服务器协调,共享令牌验证信息。
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {private static final String RESOURCE_ID = "api-resource";@Overridepublic void configure(ResourceServerSecurityConfigurer resources) {resources.resourceId(RESOURCE_ID) // 设置资源ID.tokenStore(tokenStore()) // 设置令牌存储.tokenExtractor(new BearerTokenExtractor()) // 令牌提取器.authenticationEntryPoint(new OAuth2AuthenticationEntryPoint()) // 认证入口点.accessDeniedHandler(new OAuth2AccessDeniedHandler()); // 访问拒绝处理器}@Overridepublic void configure(HttpSecurity http) throws Exception {// 配置受保护资源的访问规则http.requestMatchers().antMatchers("/api/**") // 仅应用于/api路径下的资源.and().authorizeRequests().antMatchers(HttpMethod.GET, "/api/public/**").permitAll() // 公共资源.antMatchers("/api/admin/**").hasRole("ADMIN") // 管理员资源.antMatchers("/api/users/**").access("#oauth2.hasScope('read')") // 基于作用域控制.antMatchers(HttpMethod.POST, "/api/**").access("#oauth2.hasScope('write')") // 写操作需要write作用域.anyRequest().authenticated() // 其他请求需要认证.and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler()); // 自定义访问拒绝处理}@Beanpublic TokenStore tokenStore() {// 与授权服务器使用相同的令牌存储方式return new JwtTokenStore(accessTokenConverter());}@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey("secret-key"); // 使用与授权服务器相同的签名密钥return converter;}// 自定义方法级安全控制@Beanpublic MethodSecurityExpressionHandler methodSecurityExpressionHandler() {OAuth2MethodSecurityExpressionHandler expressionHandler = new OAuth2MethodSecurityExpressionHandler();return expressionHandler;}
}// 为不同微服务配置不同的资源ID和访问规则
@Configuration
@EnableResourceServer
public class UserServiceResourceConfig extends ResourceServerConfigurerAdapter {private static final String RESOURCE_ID = "user-service";@Overridepublic void configure(ResourceServerSecurityConfigurer resources) {resources.resourceId(RESOURCE_ID);}@Overridepublic void configure(HttpSecurity http) throws Exception {http.requestMatchers().antMatchers("/users/**").and().authorizeRequests().antMatchers("/users/profile/**").access("#oauth2.hasScope('user_profile')").antMatchers("/users/admin/**").hasRole("USER_ADMIN").anyRequest().authenticated();}
}
五、远程令牌验证与内省
在分布式系统中,资源服务器需要验证请求中携带的令牌有效性。Spring Security提供了两种主要方式:远程令牌验证(资源服务器通过HTTP请求调用授权服务器的检查令牌端点)和本地令牌验证(使用共享密钥在本地验证JWT令牌)。对于非JWT令牌,通常采用OAuth2内省协议(RFC 7662)进行验证。内省允许资源服务器查询令牌的当前状态,包括是否有效、关联的范围和期限等。合理配置令牌验证机制对系统性能和安全性具有重要影响。
@Configuration
@EnableResourceServer
public class RemoteTokenValidationConfig extends ResourceServerConfigurerAdapter {@Autowiredprivate Environment env;@Overridepublic void configure(ResourceServerSecurityConfigurer resources) throws Exception {resources.tokenServices(remoteTokenServices()).stateless(true);}// 远程令牌服务配置(适用于非JWT令牌)@Beanpublic RemoteTokenServices remoteTokenServices() {RemoteTokenServices tokenServices = new RemoteTokenServices();// 设置检查令牌端点URLtokenServices.setCheckTokenEndpointUrl(env.getProperty("auth-server.url") + "/oauth/check_token");// 设置客户端凭据tokenServices.setClientId(env.getProperty("auth-server.client-id"));tokenServices.setClientSecret(env.getProperty("auth-server.client-secret"));// 设置自定义访问器适配器(可选)tokenServices.setAccessTokenConverter(accessTokenConverter());return tokenServices;}@Beanpublic AccessTokenConverter accessTokenConverter() {DefaultAccessTokenConverter converter = new DefaultAccessTokenConverter();// 自定义用户信息提取DefaultUserAuthenticationConverter userConverter = new DefaultUserAuthenticationConverter();userConverter.setUserDetailsService(userDetailsService());converter.setUserTokenConverter(userConverter);return converter;}@Beanpublic UserDetailsService userDetailsService() {// 实现用户详情服务,用于将令牌中的用户信息转换为UserDetails对象return new CustomUserDetailsService();}
}// OAuth2内省客户端配置
@Configuration
public class OAuth2IntrospectionConfig {@Value("${oauth2.introspection.url}")private String introspectionUrl;@Value("${oauth2.client.id}")private String clientId;@Value("${oauth2.client.secret}")private String clientSecret;@Beanpublic OAuth2IntrospectionAuthenticationManager introspectionAuthenticationManager() {OAuth2IntrospectionAuthenticationProvider provider = new OAuth2IntrospectionAuthenticationProvider(introspectionClient());return new OAuth2IntrospectionAuthenticationManager(provider);}@Beanpublic OAuth2IntrospectionClient introspectionClient() {return new OAuth2IntrospectionClient() {@Overridepublic OAuth2TokenIntrospection introspect(String token) {// 实现内省请求逻辑RestTemplate restTemplate = new RestTemplate();// 设置Basic认证头HttpHeaders headers = new HttpHeaders();headers.setBasicAuth(clientId, clientSecret);// 构建请求体MultiValueMap<String, String> body = new LinkedMultiValueMap<>();body.add("token", token);// 发送内省请求HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(body, headers);try {ResponseEntity<Map<String, Object>> response = restTemplate.exchange(introspectionUrl,HttpMethod.POST,request,new ParameterizedTypeReference<Map<String, Object>>() {});// 解析响应Map<String, Object> introspectionData = response.getBody();return new DefaultOAuth2TokenIntrospection(introspectionData);} catch (Exception e) {throw new OAuth2IntrospectionException("令牌内省失败", e);}}};}
}
总结
Spring Security OAuth2提供了强大而灵活的机制,用于实现标准化的授权服务器和资源服务器。通过合理配置授权服务器,开发者可以自定义客户端注册、授权类型、令牌策略等,满足不同应用场景的需求。令牌存储策略的选择应基于系统性能、安全性和部署环境等因素,JWT令牌因其自包含特性在微服务架构中尤为适用。资源服务器配置则专注于保护API资源,通过URL级别和方法级别的安全控制,确保只有持有有效令牌且具备适当权限的请求才能访问受保护资源。在分布式系统中,资源服务器可通过远程令牌验证或内省机制与授权服务器协同工作,也可利用JWT的自验证特性在本地完成令牌验证。虽然Spring Security OAuth项目已进入维护模式,但其核心概念和配置模式仍适用于现有系统,而新项目则可考虑使用Spring Authorization Server作为替代。通过掌握这些配置技术,开发者能够构建安全、标准化且高效的OAuth2实现,为分布式应用提供可靠的认证与授权保障。
相关文章:
SpringSecurity OAuth2:授权服务器与资源服务器配置
文章目录 引言一、OAuth2基础概念与架构二、授权服务器配置三、令牌策略与存储方式四、资源服务器配置五、远程令牌验证与内省总结 引言 在现代分布式应用架构中,OAuth2已成为实现安全授权与认证的事实标准。Spring Security对OAuth2提供了全面支持,使开…...
Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?
🚀 Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?🤔 父组件:identify-list.vue子组件:fake-clue-list.vue 嘿,各位前端探险家!👋 今天我们要在 Vue 2 的代码丛林…...
C#高级:启动、中止一个指定路径的exe程序
一、启动一个exe class Program {static void Main(string[] args){string exePath "D:\测试\Test.exe";// 修改为你要运行的exe路径StartProcess(exePath);}private static bool StartProcess(string exePath){// 创建一个 ProcessStartInfo 对象来配置进程启动参…...
windows下安装sublime
sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…...
Qt 日志输出(重定向)
在软件开发中,日志输出是调试和问题排查的关键手段。Qt框架提供了灵活的日志系统,支持从简单的控制台输出到复杂的自定义日志处理。本文将详细介绍Qt中五种常用的日志输出方法,并附上完整代码示例。 一、使用Qt内置日志函数 Qt提供了五个全局…...
51c嵌入式~MOS~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12074888 一、MOS管:米勒效应、开关损耗以及参数匹配 MOS管即场效应管(MOSFET),属于压控型,是一种应用非常广泛的功率型开关元件,在开关电源、逆变器…...
一文详解k8s体系架构知识
0.云原生 1.k8s概念 1. k8s集群的两种管理角色 Master:集群控制节点,负责具体命令的执行过程。master节点通常会占用一股独立的服务器(高可用部署建议用3台服务器),是整个集群的首脑。 Master节点一组关键进程…...
Linux内核软中断分析
一、软中断类型 在Linux内核中,中断处理分为上半部(硬中断)和下半部。上半部负责快速响应硬件事件,而下半部用于处理耗时任务,避免阻塞系统。下半部有三种机制:软中断(Softirq)、小任…...
从医疗大模型到综合医疗智能体:算法、架构与路径全流程分析
一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,医疗领域正经历着深刻的变革。医疗智能体作为人工智能技术在医疗行业的重要应用,正逐渐成为提升医疗服务质量、优化医疗流程、促进医疗资源合理分配的关键力量。从最初简单的医疗信息管理系统,到如今能够辅助诊断、制定…...
2025跳槽学习计划
(1)编程基础: 目录学习资料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv数据结…...
数据库后续
-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…...
程序员软件工具推荐列表
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 程序员软件工具推荐列表1. Snipaste2. VSCod…...
如何在WordPress中限制用户登录到一台设备
在当今的互联网环境下,许多用户习惯共享账户信息,虽然看似无害,却可能对网站运营产生负面影响。尤其是对于那些经营会员网站和在线课程的平台,限制用户同时登录的设备数量显得尤为重要。本文将详细探讨如何在WordPress中限制用户登…...
基于大模型的自发性气胸全方位预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测自发性气胸的原理及技术基础 2.1 大模型介绍 2.2 模型构建与训练数据 2.3 模型训练与优化 三、术前风险预测与准备 3.1 术前风险预测指标 3.2 基于预测的术前准备 3.3 手术方案与麻醉方案制定…...
文章记单词 | 第14篇(六级)
一,单词释义 affection:n. 喜爱,钟爱;爱慕之情;感情stream:n. 小河,溪流;一连串,源源不断;水流,气流;vi. 流,流动&#x…...
系统如何查找文件?inode号又是什么?
下面分别详细解释您提到的三个问题: “文件系统怎么定位文件”、“inode 是什么”、“为什么删除后还可能被占用”。 一、文件系统怎么定位文件 1.1 目录与文件名并不直接存储文件数据 在常见的 Unix/Linux 文件系统(如 ext4、xfs)或类似的…...
Uni-app入门到精通:tabBar节点实现多页面的切换
tabBar节点用于实现多页面的切换。对于一个多tabBar应用,可以通过tabBar节点配置项指定一级导航栏,以及tabBar切换时显示的对应页面。在pages.json中提供tabBar节点配置,不仅是为了方便快速开发导航,更重要的是提示App平台和小程序…...
torchvision中数据集的使用
1、torchvision及其数据集的介绍 1.1 torchvision介绍 torchvision 是 PyTorch 的一个官方库,专门用于计算机视觉任务。它提供了以下核心功能: 预训练模型:如 ResNet、VGG、EfficientNet 等。数据集:内置常用视觉数据集…...
uniapp开发实战自定义组件形式实现自定义海报功能
在 UniApp 中实现自定义海报功能,可以通过 Canvas 来绘制海报。Canvas 提供了丰富的绘图 API,可以精确控制文字、图片和二维码的位置。下面是一个完整的示例,展示如何创建一个自定义海报组件。 项目结构 假设你的项目结构如下: project-root/ ├── pages/ │ └──…...
Java EE 进阶:MyBatis-plus
MyBatis-plus的介绍 MyBatis-plus是MyBatis的增强工具,在MyBatis的基础上做出加强,只要MyBatis有的功能MyBatis-plus都有。 MyBatis-plus的上手 添加依赖 在我们创建项目的时候,我们需要添加MyBatis-plus和mysql的依赖 MyBatis-plus的依赖…...
信息学奥赛一本通 1514:【例 2】最大半连通子图 | 洛谷 P2272 [ZJOI2007] 最大半连通子图
【题目链接】 ybt 1514:【例 2】最大半连通子图 洛谷 P2272 [ZJOI2007] 最大半连通子图 【题目考点】 1. 图论:强连通分量 缩点 2. 图论:拓扑排序 有向无环图动规 【解题思路】 对于图中任意两顶点u、v,满足u到v或v到u有路径…...
正则表达式-笔记
文章目录 一、正则表达式二、正则表达式的基本语法字符类普通字符非打印字符特殊字符 量词限定符锚点修饰符(标记) 三、在 Python 中使用正则表达式简单搜索提取信息替换文本 参考 从验证用户输入,到从大量文本中提取特定信息,再到…...
Linux 练习二 LVS的NAT模式
作业 要求:使用LVS的 NAT 模式实现 3 台 RS 的轮询访问。IP地址和主机自己规划。 节点规划 主机角色系统网络IPclientclientredhat 9.5仅主机192.168.60.100/24lvslvsredhat 9.5仅主机 NAT192.168.60.200/24 VIP 192.168.23.8/24 DIPnginxrs1redhat 9.5NAT192.16…...
以科技赋能,炫我云渲染受邀参加中关村文化科技融合影视精品创作研讨会!
在文化与科技深度融合的时代浪潮下,影视创作行业经历着前所未有的变革。影视创作行业发展态势迅猛, 同时也面临着诸多挑战。为促进影视创作行业的创新发展,加强业内交流与合作, 3月25日下午,海淀区文化创意产业协会举办…...
Matlab2024a免费版下载教程
Matlab是一个高性能的数学计算与仿真软件,广泛应用于科学计算、数据分析、算法开发以及工程绘图等多个领域。它提供了强大的矩阵运算能力、丰富的内置函数库以及灵活的编程环境,使得用户能够高效地解决复杂的数学问题。本文,我将为大家详细介…...
人工智能:officeAI软件,如何调整AI对话界面的字体?
1、首先,随便打开一个excel(使用wps) 依次点击上方的【OfficeAI】—【右侧面板】 2、在弹出的面板中,输入:助手设置 , 然后按【回车】发送出去 3、之后会弹出界面,在【样式设定】中ÿ…...
ARCGIS PRO SDK VB2022 图层要素类类型判断
arcgis pro 常见要素类类型有以下几种: FeatureLayer ——要素图层(矢量数据) RasterLayer ——栅格图层 MapImageLayer ——地图图像图层 VectorTileLayer ——矢量切片图层 SceneLayer …...
一种监控录像视频恢复的高效解决方案,从每一帧中寻找可能性
该软件旨在恢复从监控设备中删除或丢失的视频。该程序经过调整以处理大多数流行供应商的闭路电视系统中使用的专有格式,并通过智能重建引擎进行了增强,能够为监控记录提供任何通用解决方案都无法实现的恢复结果。如果不需要持续使用该软件,则…...
windows安装JDK并配置环境变量
一、JDK安装 1.控制面板-程序有的话,先卸载 2.双击安装 3.下一步 4.选择安装路径 5.下一步,等着安装完成 6.校验安装是否成功,winr,输入“cmd” 疑问:安装17,显示21?? 二、环境变量 1.计算机…...
Web3.0合约安全:重入攻击防御方案
本文深度剖析智能合约重入攻击的13种新型变种及其防御体系,结合EIP-6780标准与Layer2安全方案,系统性阐述从代码层到协议层的立体防护策略。通过解析Uniswap、Compound等顶级项目的安全实践,揭示如何构建零重入风险的智能合约架构。 第一章 重…...
一文详解QT环境搭建:ubuntu20.4安装配置Qt5
随着软件开发技术的不断进步,跨平台应用程序的需求日益增长,开发者们面临着如何在不同操作系统之间保持代码的一致性和效率的问题。Qt作为一个成熟的跨平台C框架,在这方面提供了卓越的支持,不仅简化了GUI应用程序的创建过程&#…...
Android开发: Java文件中操作基础UI组件
Android Java文件中基础UI组件操作指南 一、常用UI组件基本操作 1. TextView文本控件 TextView textView findViewById(R.id.textView);// 设置文本内容 textView.setText("欢迎使用Android");// 设置文本颜色 textView.setTextColor(Color.BLUE); // 使用Color…...
监控易一体化运维:监控易机房管理,打造高效智能机房
在数字化浪潮中,企业对数据中心和机房的依赖程度与日俱增,机房的稳定运行成为业务持续开展的关键支撑。信息化的变迁,见证了机房管理从传统模式向智能化、精细化转变的过程。今天,就为大家深度剖析监控易在机房管理方面的卓越表现…...
Vue3当中el-tree树形控件使用
tree悬停tooltip效果 文本过长超出展示省略号 如果文本超出悬停显示tooltip效果 反之不显示 这里直接控制固定宽度限制 试了监听宽度没效果<template><el-treeshow-checkbox:check-strictly"true":data"data"node-key"id":props"…...
vs 2022安装指南
一、前言 Visual Studio 2022(以下简称 VS 2022)是微软推出的一款功能强大的集成开发环境(IDE),它支持多种编程语言,如 C#、C、Python 等,广泛应用于桌面应用、Web 应用、移动应用以及游戏开发…...
【数学建模】(启发式算法)蚁群算法(Ant Colony Optimization)的详解与应用
蚁群算法(Ant Colony Optimization)详解与应用 文章目录 蚁群算法(Ant Colony Optimization)详解与应用前言1. 蚁群算法的生物学基础2. 蚁群算法的基本原理2.1 算法框架2.2 状态转移规则2.3 信息素更新规则 3. 蚁群算法的实现4. 蚁群算法的改进4.1 MAX-MIN蚁群系统(MMAS)4.2 精…...
03-SpringBoot3入门-配置文件(自定义配置及读取)
1、自定义配置 # 自定义配置 zbj:user:username: rootpassword: 123456# 自定义集合gfs:- a- b- c2、读取 1)User类 package com.sgu.pojo;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.spring…...
Sentinel[超详细讲解]-2
异常处理 默认情况下,Sentinel 会抛出 BlockException 异常,如果希望自定义异常,则可以使用 SentinelResource 注解的 blockHandler 属性。 1、自定义异常处理 BlockExceptionHandler 自定义异常处理类实现 BlockExceptionHandler 接口&#…...
API 请求需要证书认证? 如何在 Postman 中正确配置和使用?
本文来介绍 Postman 提供的管理证书功能如何配置,要了解更多相关的知识,可访问 Postman 证书 模块。 管理客户端证书,点击对应的按钮,首先选择 SETTINGS ,然后选择 Certificate 选项卡,如图所示࿱…...
NG-ZORRO中tree组件的getCheckedNodeList怎么使用
在 NG-ZORRO(Ant Design for Angular) 的 Tree 组件 中,getCheckedNodeList 方法用于获取当前选中的节点列表(包括半选状态节点)。以下是具体用法和示例: 基本用法 首先,确保你已通过 ViewChil…...
对于有前后逻辑依赖关系的长文本,切分时确实需要特别注意上下文的连续性,以便在召回后知识时能够尽量保留前后文的关联。
对于有前后逻辑依赖关系的长文本,切分时确实需要特别注意上下文的连续性,以便在召回后知识时能够尽量保留前后文的关联。以下是你提到的三种切分方案的分析,以及如何在实践中选择和优化: 1. 滑动窗口切分 原理:通过一…...
关于ArcGIS中加载影像数据,符号系统中渲染参数的解析
今天遇到一个很有意思的问题,故记录下来,以作参考和后续的研究。欢迎随时沟通交流。如果表达错误或误导,请各位指正。 正文 当我们拿到一幅成果影像数据的时候,在不同的GIS软件中会有不同效果呈现,但这其实是影像是…...
图解AUTOSAR_SWS_FlashTest
AUTOSAR Flash Test 模块解析文档 AUTOSAR 经典平台内存硬件抽象层模块详解 目录 1. 概述 1.1 Flash Test 模块简介1.2 模块作用和定位2. 架构设计 2.1 整体架构2.2 状态机设计3. 执行流程 3.1 后台测试序列3.2 前台测试序列4. 配置结构 4.1 模块配置详解5. 总结1. 概述 1.1 F…...
Ubuntu 使用终端手动连接无线网络(wlan0)完整流程 + 故障排查记录
在某些场景下(如 Ubuntu GUI 网络管理器不可用、使用轻量级桌面环境、或远程配置 Jetson Nano 等嵌入式设备),我们可能需要通过终端命令手动连接无线网络。本文记录一次真实的操作流程和排查过程,供自己和有需要的小伙伴参考。 &a…...
BNB Chain 何以打造 AI 驱动链上应用新世界?
人工智能正在加速改变 Web3 行业的现状面貌。最初 AI 代理起源于机器人技术和机器学习,它们通过自主系统调适,根据数据和环境做出相应技术决策支持、解决项目运行难题并执行相关任务。到了 Web3 世界,AI 代理开始融入 DAO、预测分析和自动交易…...
C 语言常用关键字详解:static、const、volatile
C 语言常用关键字详解:static、const、volatile 文章目录 C 语言常用关键字详解:static、const、volatile1. static 关键字1.1 用于局部变量示例: 1.2 用于全局变量示例: 1.3 用于函数示例: 2. const 关键字2.1 用于局…...
剑指Offer35- - 链表
1. 题目描述 这题题意感觉说的不是很清楚,容易让人产生歧义!其实题意很简单,给你一个链表 head,你深拷贝它,然后返回即可,注意不能修改原链表 /* // Definition for a Node. class Node { public:int val;N…...
open-cv的安装
python -m pip install numpy matplotlib opencv-python 【记得科学上网,不然太慢了】...
【ESP32】VSCode配置ESP-IDF问题及解决方法
报错:“D:\Espressif\tools\idf-python\3.11.2\python.exe -m pip” is not valid. (ERROR_INVALID_PIP) 当遇到错误 “d:\espressif\tools\idf-python\3.11.2\python.exe -m pip” is not valid. (error_invalid_pip) 时,通常是由于 pip 版本不兼容或未…...
分布式渲染与云渲染:技术与应用的黄金搭档
一、核心概念:先区分再关联 分布式渲染是通过多台设备并行计算拆分渲染任务的技术(如将一帧拆分为 64 个小块,64 台电脑同时渲染); 云渲染是基于云计算的渲染服务,本质是分布式渲染的商业化落地—— 用户无…...