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

Spring Security 全面指南:从基础到高级实践

一、Spring Security 概述与核心概念

1.1 Spring Security 简介

Spring Security 是 Spring 生态系统中的安全框架,为基于 Java 的企业应用提供全面的安全服务。它起源于 2003 年的 Acegi Security 项目,2008 年正式成为 Spring 官方子项目,现已发展为企业级安全的事实标准。

核心特性

  • 认证(Authentication):验证用户身份
  • 授权(Authorization):控制访问权限
  • 防护(Protection):抵御常见攻击(CSRF、XSS 等)
  • 集成(Integration):与 Spring、Servlet API、OAuth2 等无缝集成
  • 扩展(Extensibility):高度模块化,支持自定义扩展

1.2 安全过滤器链

Spring Security 的核心是基于 Servlet Filter 的过滤器链(Filter Chain):

客户端请求 → DelegatingFilterProxy → FilterChainProxy → 安全过滤器链 → 应用

关键过滤器

  1. SecurityContextPersistenceFilter:维护安全上下文
  2. UsernamePasswordAuthenticationFilter:处理表单登录
  3. BasicAuthenticationFilter:处理 HTTP 基本认证
  4. RememberMeAuthenticationFilter:处理"记住我"功能
  5. AnonymousAuthenticationFilter:匿名用户处理
  6. ExceptionTranslationFilter:处理安全异常
  7. FilterSecurityInterceptor:授权决策

1.3 核心组件

组件职责重要实现类
SecurityContextHolder保存安全上下文ThreadLocalSecurityContextHolder
Authentication封装认证信息UsernamePasswordAuthenticationToken
UserDetails用户详细信息User
UserDetailsService加载用户数据InMemoryUserDetailsManager
AuthenticationManager认证入口ProviderManager
AccessDecisionManager授权决策AffirmativeBased

二、快速入门:基础配置

2.1 添加依赖

Maven 配置

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope>
</dependency>

2.2 最小配置示例

@Configuration
@EnableWebSecurity
public class BasicSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Bean@Overridepublic UserDetailsService userDetailsService() {UserDetails user = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(user);}
}

2.3 自定义用户存储

2.3.1 JDBC 用户存储
@Autowired
private DataSource dataSource;@Bean
public UserDetailsService userDetailsService() {return new JdbcUserDetailsManager(dataSource);
}

初始化 SQL 脚本(schema.sql):

CREATE TABLE users (username VARCHAR(50) NOT NULL PRIMARY KEY,password VARCHAR(100) NOT NULL,enabled BOOLEAN NOT NULL
);CREATE TABLE authorities (username VARCHAR(50) NOT NULL,authority VARCHAR(50) NOT NULL,FOREIGN KEY (username) REFERENCES users(username)
);INSERT INTO users VALUES ('user', '{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', true);
INSERT INTO authorities VALUES ('user', 'ROLE_USER');
2.3.2 自定义用户服务
@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("用户不存在"));return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),user.getAuthorities());}
}

三、认证机制详解

3.1 密码编码器

Spring Security 5 强制要求密码编码:

编码器描述示例
BCryptPasswordEncoderBCrypt 哈希$2a$10$N9qo8uLOickgx2ZMRZoMy...
Pbkdf2PasswordEncoderPBKDF25d923b44a6d129f3ddf3e3c8...
SCryptPasswordEncoderSCrypt$e0801$N8QxJj5YQnK7vjMp...
Argon2PasswordEncoderArgon2$argon2id$v=19$m=1024,t=...

配置示例

@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}

3.2 多种认证方式

3.2.1 表单登录
http.formLogin().loginPage("/login")          // 自定义登录页.loginProcessingUrl("/auth")  // 处理登录的URL.usernameParameter("uname")   // 用户名参数名.passwordParameter("pwd")     // 密码参数名.defaultSuccessUrl("/home")   // 登录成功跳转.failureUrl("/login?error");  // 登录失败跳转
3.2.2 HTTP 基本认证
http.httpBasic().realmName("My App");
3.2.3 Remember-Me 认证
http.rememberMe().key("myAppKey")             // 加密密钥.tokenValiditySeconds(86400) // 有效期(秒).rememberMeParameter("remember"); // 参数名

3.3 多认证提供者

@Autowired
private CustomAuthenticationProvider customProvider;@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.authenticationProvider(customProvider).jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder());
}

自定义认证提供者

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate PasswordEncoder passwordEncoder;@Overridepublic Authentication authenticate(Authentication auth) throws AuthenticationException {String username = auth.getName();String password = auth.getCredentials().toString();UserDetails user = userDetailsService.loadUserByUsername(username);if (passwordEncoder.matches(password, user.getPassword())) {return new UsernamePasswordAuthenticationToken(username, password, user.getAuthorities());}throw new BadCredentialsException("认证失败");}@Overridepublic boolean supports(Class<?> authentication) {return authentication.equals(UsernamePasswordAuthenticationToken.class);}
}

四、授权机制详解

4.1 请求级别授权

http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").antMatchers("/api/**").access("hasRole('API') or hasIpAddress('192.168.1.0/24')").antMatchers("/db/**").access("hasAuthority('DBA') and hasIpAddress('192.168.1.100')").anyRequest().authenticated();

匹配器类型

  • antMatchers():Ant 风格路径
  • regexMatchers():正则表达式
  • mvcMatchers():Spring MVC 路径

4.2 方法级别安全

4.2.1 启用方法安全
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true,jsr250Enabled = true)
public class MethodSecurityConfig {// 配置...
}
4.2.2 常用注解
注解示例描述
@PreAuthorize@PreAuthorize("hasRole('ADMIN')")方法执行前检查
@PostAuthorize@PostAuthorize("returnObject.owner == authentication.name")方法执行后检查
@Secured@Secured("ROLE_ADMIN")简单角色检查
@RolesAllowed@RolesAllowed("USER")JSR-250 标准注解
@PreFilter@PreFilter("filterObject.owner == authentication.name")过滤集合参数
@PostFilter@PostFilter("filterObject.status == 'ACTIVE'")过滤返回值

4.3 动态权限控制

自定义权限评估器

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {@Overridepublic boolean hasPermission(Authentication auth, Object target, Object permission) {if (auth == null || !(permission instanceof String)) {return false;}// 实现自定义逻辑return checkPermission(auth, target, (String) permission);}@Overridepublic boolean hasPermission(Authentication auth, Serializable targetId, String targetType, Object permission) {// 实现基于ID的权限检查return false;}
}

注册评估器

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {@Autowiredprivate CustomPermissionEvaluator permissionEvaluator;@Overrideprotected MethodSecurityExpressionHandler createExpressionHandler() {DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();handler.setPermissionEvaluator(permissionEvaluator);return handler;}
}

五、高级安全特性

5.1 CSRF 防护

默认配置

http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

禁用 CSRF(仅限无状态 API):

http.csrf().disable();

自定义配置

http.csrf().ignoringAntMatchers("/api/**").csrfTokenRepository(new HttpSessionCsrfTokenRepository());

5.2 CORS 配置

@Bean
public CorsConfigurationSource corsConfigurationSource() {CorsConfiguration config = new CorsConfiguration();config.setAllowedOrigins(Arrays.asList("https://example.com"));config.setAllowedMethods(Arrays.asList("GET", "POST"));config.setAllowedHeaders(Arrays.asList("*"));config.setAllowCredentials(true);UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return source;
}

5.3 安全头信息

http.headers().contentSecurityPolicy("default-src 'self'").and().referrerPolicy(ReferrerPolicy.SAME_ORIGIN).and().frameOptions().sameOrigin().and().httpStrictTransportSecurity().includeSubDomains(true).maxAgeInSeconds(31536000);

5.4 会话管理

http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED).invalidSessionUrl("/invalidSession").maximumSessions(1).maxSessionsPreventsLogin(true).expiredUrl("/sessionExpired");

会话策略

  • ALWAYS:总是创建会话
  • IF_REQUIRED:必要时创建(默认)
  • NEVER:不创建,但可能使用已有会话
  • STATELESS:完全无状态(如JWT)

六、OAuth2 与 JWT 集成

6.1 OAuth2 资源服务器

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/**").authenticated();}@Overridepublic void configure(ResourceServerSecurityConfigurer resources) {resources.resourceId("my-resource");}
}

6.2 JWT 配置

@Bean
public JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey("my-secret-key");return converter;
}@Bean
public TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());
}

6.3 OAuth2 客户端

@Configuration
@EnableOAuth2Client
public class OAuth2ClientConfig {@Beanpublic OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext context, OAuth2ProtectedResourceDetails details) {return new OAuth2RestTemplate(details, context);}
}

七、测试与调试

7.1 测试安全配置

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class SecurityTest {@Autowiredprivate MockMvc mockMvc;@Test@WithMockUser(username="user", roles="USER")public void testUserAccess() throws Exception {mockMvc.perform(get("/user/profile")).andExpect(status().isOk());}@Test@WithAnonymousUserpublic void testUnauthorizedAccess() throws Exception {mockMvc.perform(get("/admin")).andExpect(status().isForbidden());}
}

7.2 调试技巧

  1. 启用调试日志

    logging.level.org.springframework.security=DEBUG
    
  2. 自定义访问决策日志

    @Component
    public class SecurityLogger {private static final Logger log = LoggerFactory.getLogger(SecurityLogger.class);@PreAuthorize("hasRole('ADMIN')")public void adminOnly() {log.info("Admin method accessed");}
    }
    
  3. 使用 SecurityContextHolder

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    log.info("Current user: {}", auth.getName());
    

八、最佳实践

8.1 安全配置建议

  1. 密码策略

    • 使用强密码编码器(BCrypt)
    • 定期更新加密密钥
    • 实现密码过期策略
  2. API 安全

    • REST API 使用无状态认证(JWT)
    • 实现速率限制
    • 记录安全相关事件
  3. 生产环境配置

    http.requiresChannel().anyRequest().requiresSecure().and().headers().contentTypeOptions().and().xssProtection().and().cacheControl();
    

8.2 性能优化

  1. 缓存用户数据

    @Bean
    public UserDetailsService userDetailsService() {return new CachingUserDetailsService(new JdbcUserDetailsManager(dataSource));
    }
    
  2. 优化会话存储

    • 使用 Redis 等分布式存储
    • 配置合适的会话超时
  3. 减少过滤器链

    http.securityMatcher("/api/**"); // 仅对API路径应用安全
    

8.3 常见问题解决

  1. 循环依赖

    • 避免在 WebSecurityConfigurerAdapter 中直接注入服务
    • 使用 @Lazy 注解
  2. 配置顺序问题

    • 确保 @Order 注解正确使用
    • 重要配置放在高优先级
  3. 跨域问题

    • 正确配置 CORS
    • 确保安全过滤器在 CORS 过滤器之后

九、Spring Security 5 新特性

9.1 OAuth2 登录

http.oauth2Login().loginPage("/login").defaultSuccessUrl("/home").userInfoEndpoint().userService(customOAuth2UserService);

9.2 响应式安全

@EnableWebFluxSecurity
public class ReactiveSecurityConfig {@Beanpublic SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {return http.authorizeExchange().pathMatchers("/admin/**").hasRole("ADMIN").anyExchange().authenticated().and().httpBasic().and().build();}
}

9.3 密码编码迁移

@Bean
public PasswordEncoder passwordEncoder() {return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

十、总结

Spring Security 作为企业级安全框架,提供了从认证授权到攻击防护的全面解决方案。通过本文的学习,我们掌握了:

  1. 核心架构与基础配置
  2. 认证与授权机制
  3. 高级安全特性
  4. OAuth2 与 JWT 集成
  5. 测试与最佳实践

无论是简单的 Web 应用还是复杂的微服务架构,Spring Security 都能提供合适的安全解决方案。希望本指南能帮助你在项目中构建更加安全可靠的系统。


PS:如果你在学习过程中遇到问题,别担心!欢迎在评论区留言,我会尽力帮你解决!😄

相关文章:

Spring Security 全面指南:从基础到高级实践

一、Spring Security 概述与核心概念 1.1 Spring Security 简介 Spring Security 是 Spring 生态系统中的安全框架&#xff0c;为基于 Java 的企业应用提供全面的安全服务。它起源于 2003 年的 Acegi Security 项目&#xff0c;2008 年正式成为 Spring 官方子项目&#xff0c…...

IP组播 C++简单应用

引言 在当今的网络世界中&#xff0c;数据的传输效率和带宽的合理利用是至关重要的。传统的单播和广播通信方式在某些场景下存在着局限性&#xff0c;而IP组播技术的出现为解决这些问题提供了一种有效的方案。本文将详细介绍IP组播的概念、工作原理、应用场景&#xff0c;并通…...

CentOS 7安装 mysql

CentOS 7安装 mysql 1. yum 安装 mysql 配置mysql源 yum -y install mysql57-community-release-el7-10.noarch.rpm安装MySQL服务器 yum -y install mysql-community-server启动MySQL systemctl start mysqld.service查看MySQL运行状态&#xff0c;运行状态如图&#xff…...

“十五五”时期航空弹药发展环境分析

1&#xff0e;“十五五”时期航空弹药发展环境分析 &#xff08;标题&#xff1a;小二号宋体居中&#xff09; 一、建言背景介绍 &#xff08;一级标题&#xff1a;黑体三号&#xff0c;首行空两格&#xff09; 航空弹药作为现代战争的核心装备&#xff0c;其发展水平直接关乎…...

es6的100个问题

基础概念 解释 let、const 和 var 的区别。什么是块级作用域&#xff1f;ES6 如何实现它&#xff1f;箭头函数和普通函数的主要区别是什么&#xff1f;解释模板字符串&#xff08;Template Literals&#xff09;的用途&#xff0c;并举例嵌套变量的写法。解构赋值的语法是什么…...

在直播间如何和观众进行互动

在抖音直播间实现高效互动需要**技术话术工具**的立体化组合&#xff0c;以下是程序员可落地的深度互动方案&#xff1a; --- ### 一、技术驱动型互动策略 #### 1. **实时代码演示&#xff08;硬核互动&#xff09;** - **OBS虚拟摄像头屏幕共享** python # 用Flask创建实…...

mysql--用户管理

MySQL 用户管理完整指南 1. 查看用户信息 查看所有用户 SELECT User, Host, authentication_string FROM mysql.user;查看用户详细信息 SELECT * FROM mysql.user \G查看当前登录用户 SELECT CURRENT_USER();查看特定用户的权限 SHOW GRANTS FOR usernamehost;2. 创建用户…...

.NET三层架构详解

.NET三层架构详解 文章目录 .NET三层架构详解引言什么是三层架构表示层&#xff08;Presentation Layer&#xff09;业务逻辑层&#xff08;Business Logic Layer&#xff0c;BLL&#xff09;数据访问层&#xff08;Data Access Layer&#xff0c;DAL&#xff09; .NET三层架构…...

机器学习之回归

1. 引言 回归分析是机器学习中的基本技术之一,广泛用于预测连续型变量。本文调研了线性回归、多项式回归、岭回归、Lasso回归及弹性网络回归,重点分析其数学原理、算法推导、求解方法及应用场景。 2. 线性回归 2.1 概述 线性回归假设因变量与自变量之间存在线性关系,其目…...

危险化合物安全处理,有机反应淬灭操作解析

化学淬灭操作是指在化学反应过程中&#xff0c;通过人为干预快速终止反应的技术。在有机化学反应中&#xff0c;某一反应底物是过量的&#xff0c;当化学反应进行到一定程度&#xff0c;目标产物已经获得&#xff0c;该过量反应底物继续存在会进一步反应生成副产物或者影响后处…...

【前端】使用 HTML、CSS 和 JavaScript 创建一个数字时钟和搜索功能的网页

文章目录 ⭐前言⭐一、项目结构⭐二、HTML 结构⭐三、CSS 样式⭐四、JavaScript 功能⭐五、运行效果⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数…...

【Linux】调试器——gdb使用

目录 一、预备知识 二、常用指令 三、调试技巧 &#xff08;一&#xff09;监视变量的变化指令 watch &#xff08;二&#xff09;更改指定变量的值 set var 正文 一、预备知识 程序的发布形式有两种&#xff0c;debug和release模式&#xff0c;Linux gcc/g出来的二进制…...

Windows10清理机器大全集

Windows10清理机器大全集 写在前面先这么个标题&#xff0c;逐渐补充禁止Update移除Microsoft Compatibility Telemetrywindows-defender-remover其它 写在前面 看到标题&#xff0c;读者已经就吐了。 我是说&#xff0c;我非常认可: IT从业者&#xff0c;如果你银子比较充足&…...

解决IDEA中maven找不到依赖项的问题

直接去官网找到对应的依赖项jar包&#xff0c;并且下载到本地&#xff0c;然后安装到本地厂库中。 Maven官网&#xff1a;https://mvnrepository.com/ 一、使用mvn install:install-file命令 Maven提供了install:install-file插件&#xff0c;用于手动将jar包安装到本地仓库…...

端游熊猫脚本游戏精灵助手2025游戏办公脚本工具!游戏脚本软件免费使用

在当下这个崇尚高效与便捷的时代&#xff0c;自动化工具已然成为诸多开发者与企业提升工作效率的关键选择。熊猫精灵脚本助手作为一款极具实力的自动化工具&#xff0c;凭借其多样的功能以及广泛的应用场景&#xff0c;逐步成为众多用户的首要之选。 熊猫精灵脚本助手整合了丰…...

知识就是力量——物联网应用技术

基础知识篇 一、常用电子元器件1——USB Type C 接口引脚详解特点接口定义作用主从设备关于6P引脚的简介 2——常用通信芯片CH343P概述特点引脚定义 CH340概述特点封装 3——蜂鸣器概述类型驱动电路原文链接 二、常用封装介绍贴片电阻电容封装介绍封装尺寸与功率关系&#xff1…...

第4.1节:使用正则表达式

1 第4.1节&#xff1a;使用正则表达式 将正则表达式用斜杠括起来&#xff0c;就能用作模式。随后&#xff0c;该正则表达式会与每条输入记录的完整文本进行比对。&#xff08;通常情况下&#xff0c;它只需匹配文本的部分内容就能视作匹配成功。&#xff09;例如&#xff0c;以…...

Linux目录及文件管理

目录 一.Linux目录基本结构 1.常见目录及其作用 二.常用文件处理命令 1.七类常见的linux的文件 2.cat&#xff08;查看文件内容&#xff09; 3.more(分页查看文件内容&#xff09; 4.less(分页查看文件内容&#xff09; 5.head&#xff08;从头部查看文件内容&#xff0…...

【MySQL】从零开始:掌握MySQL数据库的核心概念(五)

由于我的无知&#xff0c;我对生存方式只有一个非常普通的信条&#xff1a;不许后悔。 前言 这是我自己学习mysql数据库的第五篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的增删查改&#xff0c;没看的同学可以过去看看&#xf…...

进军场景智能体,云迹机器人又快了一步

&#xff08;图片来源&#xff1a;Pixels&#xff09; 2025年&#xff0c;AI和机器人行业都发生了巨大改变。 数科星球原创 作者丨苑晶 编辑丨大兔 2025年&#xff0c;酒店行业正掀起一股批量采购具备AI功能的软硬一体解决方案的热潮。 在DeepSeek、Manus等国产AI软件的推动…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-5.2.1 多字段权重控制(标题、品牌、类目)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 电商商品搜索实战&#xff1a;多字段权重控制策略1. 业务场景与核心挑战1.1 典型搜索问题1.2 权重失衡的影响数据 2. 权重控制核心方案2.1 字段权重分配矩阵2.2 多策略组合方…...

Ubuntu24.04 离线安装 MySQL8.0.41

一、环境准备 1.1 官方下载MySQL8.0.41 完整包 1.2 上传包 & 解压 上传包名称是&#xff1a;mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL8 # 解压&#xff1a; tar -xvf mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundl…...

【Django】教程-3-数据库相关介绍

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 4.数据库连接配置 需要手动创建数据库&#xff0c;数据库无法自动创建 &#xff0c;ORM可以创建表&#xff0c;操作表 注意&#xff1a;负责app下mondels.py写类时&#xff0c;无法在数据库中…...

OpenGL绘制文本

一&#xff1a;QPainter绘制 在 OpenGL 渲染的窗口中&#xff08;如 QOpenGLWidget&#xff09;&#xff0c;通过 QPainter 直接绘制文本。Qt 会自动将 2D 内容&#xff08;文本、图形&#xff09;与 OpenGL 内容合成。在paintGL()里面绘制&#xff0c;如果有其他纹理&#xf…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例6,TableView16_06 分页表格拖拽排序

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

【解决】导入PNG图片,转 Sprite 格式成功但资产未生效问题

开发平台&#xff1a;Unity 6.0 图片格式&#xff1a;.png   问题描述 当 PNG 成功转换为 Sprite&#xff08;精灵&#xff09;时&#xff0c;资产状态将显示扩展箭头&#xff0c;即表明该资产可 Sprite 使用。 解决方法&#xff1a;设置正确的 Sprite Mode Single 关于 Spr…...

【科研绘图系列】R语言绘制重点物种进化树图(taxa phylogenetic tree)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出图片系统信息介绍 【科研绘图系列】R语言绘制重点物种进化树图(taxa phylogenetic tree) 加载R包 library(tidyverse) library(ape…...

Flutter入门教程:从零开始的Flutter开发指南

Flutter入门教程&#xff1a;从环境搭建到应用发布 概述 本文提供了全面的Flutter入门教程&#xff0c;涵盖环境搭建、基础Widget使用、界面设计与美化&#xff0c;以及实战项目开发等内容。通过本教程&#xff0c;开发者能够快速上手Flutter开发&#xff0c;掌握开发跨平台应…...

CentOS 7 源码安装libjsoncpp-1.9.5库

安装依赖工具 sudo yum install cmake make gcc cmake 需要升级至 3.8.0 以上可参考&#xff1a;CentOS安装CMakegcc 需要升级至9.0 以上可参考&#xff1a;CentOS 7升级gcc版本 下载源码 wget https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.5.…...

调用高德天气Api,并展示对应天气图标

1、申请高德key 点击高德官网申请 必须有key才能调用高德api 小提示&#xff1a;每日/每秒调用api次数有限&#xff0c;尽量不要循环调用。 每日大概5000&#xff0c;每秒3次 2、查看文档 高德官网天气api接口文档 请求示例&#xff1a; https://restapi.amap.com/v3/weat…...

DSP开发板的JTAG接口

&#xff08;1&#xff09;普中DSP28335 &#xff08;2&#xff09;研旭DSP28388 &#xff08;3&#xff09;延华DSP28335 &#xff08;3&#xff09;M新动力28377D电机控制板...

1.25-20GHz/500ns超快跳频!盛铂SWFA300国产捷变频频率综合器模块赋能雷达/5G/电子战高频精密控制 本振/频综模块

盛铂SWFA300捷变频频率综合器模块简述&#xff1a; 盛铂科技国产SWFA300捷变频频率综合器是一款在频率范围内任意两点频率的跳频时间在500nS以内的高速跳频源&#xff0c;其输出频率范围为1.25GHz至20GHz&#xff0c;频率的最小步进为10kHz。同时它拥有优秀的相位噪声特性&…...

nestjs 多环境配置

这里使用yaml进行多环境配置&#xff0c;需要安装nestjs/config、js-yaml、types/js-yaml js-yaml、types/js-yaml 主要用来读取yaml文件以及指定类型使用 官方教程&#xff1a;Documentation | NestJS - A progressive Node.js framework 1、下载 npm i --save nestjs/confi…...

CentOS7系统更新yum源教程

由于CentOS 7 在2024年6月30号以后官方不再维护。很多yum源也陆续关掉了&#xff0c;所以我们要更换镜像源。yum是一个用于软件包管理的工具&#xff0c;它能够从特定的存储库中自动下载和安装软件包。然而&#xff0c;系统默认的yum源可能不包含所有软件包&#xff0c;因此需要…...

Python正则表达式(二)

目录 六、re.findall()函数和分组 1、0/1分组情况 2、多分组情况 七、或“|”的用法 1、作用域 2、用法 八、贪婪模式和懒惰模式 1、量词的贪婪模式 2、量词的懒惰模式 九、匹配对象 1、相关函数 六、re.findall()函数和分组 1、0/1分组情况 在正则表达式中&#x…...

MySQL中如何进行SQL调优?

SQL 调优是提高 MySQL 数据库性能的关键环节。以下是 MySQL SQL 调优的主要方法和技巧 一、使用 EXPLAIN 分析查询 EXPLAIN SELECT * FROM users WHERE user_name 张三;查看执行计划&#xff0c;了解 MySQL 如何处理查询重点关注 type、key、rows、Extra 列type 最好能达到 …...

Android15查看函数调用关系

Android15 Camera3中打印函数调用栈 1.使用CallStack跟踪函数调用 修改涉及三个内容&#xff1a; Android.bp中添加对CallStack的引用。CallStack被打包在libutilscallstack.so。代码中包含CallStack的头文件。代码中调用CallStack接口&#xff0c;打印函数调用栈。 例子&am…...

Containerd+Kubernetes搭建k8s集群

虚拟机环境设置&#xff0c;如果不是虚拟机可以忽略不看 1、安装配置containerd 1.1 添加 Kubernetes 官方仓库 安装cri-tools的时候需要用到 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kub…...

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权主体功能开发

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…...

个人学习编程(3-24) 数据结构

括号的匹配&#xff1a; if((s[i]) && now() || (s[i]] && now[)){ #include <bits/stdc.h>using namespace std;int main() {char s[300];scanf("%s",&s);int i;int len strlen(s);stack <char> st;for (i 0; i < len; i){if(…...

比特币等虚拟货币实时价格使用说明,数字货币价格获取,k线获取,实时价格获取

数据截图 k线数据 websocket 实时价格数据 根据这些数据可以做出自己的产品 获取时间段内的k线数据 在开始之前&#xff0c;你需要知道的知识&#xff1a; 币种缩写英文名币种IDBTCBitcoinbitcoinETHEthereumethereumEOSEOSeosUSDTTethertetherLTCLitecoinlitecoinUSDDol…...

【漏洞修复】为了修复ARM64 Android10系统的第三方库漏洞,将ARM64 Android16的系统库直接拷贝到Android10系统如何?

直接替换系统库的风险分析 将高版本Android&#xff08;如Android 16&#xff09;的系统库直接拷贝到低版本系统&#xff08;如Android 10&#xff09;可能会导致以下问题&#xff1a; 符号与依赖不兼容 高版本库可能依赖更高版本的NDK或Bionic libc&#xff08;Android的C库&…...

【深度学习与实战】2.1、线性回归模型与梯度下降法先导

import numpy as np# 数据准备 X np.array([1, 2, 3]) y np.array([3, 5, 7])# 参数初始化 w0, w1 0, 0 alpha 0.1 n len(X)# 迭代10次 for epoch in range(10):# 计算预测值y_pred w1 * X w0# 计算梯度grad_w0 (1/n) * np.sum(y_pred - y)grad_w1 (1/n) * np.sum((y_…...

SQL Server 2008安装教程

目录 一.安装SQL Server 二.安装SQL Server Management Studio 三.使用SQL Server Management Studio 一.安装SQL Server 官网下载:SQL Server 下载 | Microsoft 1.选择安装中的全新安装如下图 2.功能选择 3.实例配置 4.后面一直下一步到数据库引擎配置 密码自己设置 系统…...

协作机械臂需要加安全墙吗? 安全墙 光栅 干涉区

安全墙是什么 文章目录 安全墙是什么简介1. 物理安全墙1.1 定义&#xff1a;1.2 作用机制&#xff1a;1.3 应用场景&#xff1a; 2. 虚拟安全墙2.2 定义&#xff1a;2.3 作用机制&#xff1a;2.3 应用场景&#xff1a; 3. 安全毛毯3.1 工作原理&#xff1a;3.2 特点3.3 应用场景…...

Android第六次面试总结(自定义 View与事件分发)

在 Android 中实现自定义 View 处理 1 万条数据的流畅滑动&#xff0c;需结合视图复用、按需绘制、硬件加速等核心技术。以下是具体实现方案&#xff1a; 一、核心优化策略 1. 视图复用机制&#xff08;类似 RecyclerView&#xff09; ViewHolder 模式&#xff1a;将每个数据…...

深度解读 AWS IAM:身份访问管理与安全的核心纽带

导语 在 AWS&#xff08;亚马逊云服务&#xff09;的生态体系中&#xff0c;AWS IAM&#xff08;Identity and Access Management&#xff09;犹如坚固的堡垒&#xff0c;守护着用户在云端的各类资源。它不仅是管理用户身份与访问权限的关键工具&#xff0c;更是维系 AWS 安全…...

Oracle相关的面试题

以下是150道Oracle相关的面试题&#xff0c;涵盖了Oracle的基础概念、架构、SQL与PL/SQL、性能调优、高可用性、备份与恢复、安全、分区与索引、存储与内存管理、网络与连接、版本与升级等方面&#xff0c;希望对你有所帮助。 Oracle基础概念 1. 什么是Oracle数据库&#xff1…...

DQL语句-distinct去重

MySQL | DQL语句-distinct去重 &#x1fa84;个人博客&#xff1a;https://vite.xingji.fun 查询工作岗位 select job from emp;mysql> select job from emp;----------- | job | ----------- | CLERK | | SALESMAN | | SALESMAN | | MANAGER | | SALESMAN …...

GroupDocs.Total for Java 摸索学习

继Aspose.Total for Java 全套组件的学习之后&#xff0c;发现了GroupDocs.Total系列产品的13款&#xff0c;也是花了许久的事件&#xff0c;逐个的学习摸索、深度分析、总结实践&#xff0c;掌握了它们的科学使用。 商业技术软件&#xff0c;作为技术广度学习探索使用&#x…...