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

Apache Shiro 全面指南:从入门到高级应用

一、Shiro 概述与核心架构

1.1 什么是 Shiro?

Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了认证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(Session Management)等功能。与 Spring Security 相比,Shiro 的设计更加直观和简单,同时又不失灵活性。

Shiro 的核心优势

  • 简单性:API 设计友好,学习曲线平缓
  • 全面性:覆盖了应用安全的各个方面
  • 灵活性:可以轻松集成到任何应用环境中
  • 可扩展性:所有组件都支持自定义扩展
  • 跨平台:不仅限于 Web 应用,也可用于非 Web 环境

1.2 Shiro 核心架构

Shiro 的架构遵循了"分而治之"的设计理念,将安全功能划分为多个独立的组件:

+---------------------------------------------------+
|                   Application                     |
+---------------------------------------------------+
|                        Shiro                      |
+-------------------+----------------+--------------+
| Authentication    | Authorization  | Session Mgmt |
+-------------------+----------------+--------------+
| Cryptography      | Cache Mgmt     | Concurrency  |
+-------------------+----------------+--------------+
|                   Realms                          |
+---------------------------------------------------+
|               Security Manager                    |
+---------------------------------------------------+

核心组件解析

  1. Subject:当前操作用户的安全特定"视图"
  2. SecurityManager:Shiro 的核心,协调各安全组件
  3. Authenticator:负责认证(登录)操作
  4. Authorizer:负责授权(访问控制)决策
  5. SessionManager:管理用户会话
  6. CacheManager:提供缓存支持以提高性能
  7. Cryptography:提供加密/解密功能
  8. Realms:连接安全数据和 Shiro 的桥梁

二、快速入门:第一个 Shiro 应用

2.1 环境准备

2.1.1 添加 Maven 依赖
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version>
</dependency>
<!-- 如果需要Web支持 -->
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.9.0</version>
</dependency>
<!-- 如果需要与Spring集成 -->
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.9.0</version>
</dependency>
2.1.2 基本配置

创建 shiro.ini 配置文件:

[users]
# 格式:username = password, role1, role2, ...
admin = secret, admin
user1 = password, user
user2 = 123456, user[roles]
# 角色权限定义
admin = *
user = user:read,user:write

2.2 第一个 Shiro 示例

public class Quickstart {public static void main(String[] args) {// 1. 创建SecurityManager工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");// 2. 获取SecurityManager实例SecurityManager securityManager = factory.getInstance();// 3. 绑定SecurityManager到运行环境SecurityUtils.setSecurityManager(securityManager);// 4. 获取当前用户(Subject)Subject currentUser = SecurityUtils.getSubject();// 5. 模拟登录if (!currentUser.isAuthenticated()) {UsernamePasswordToken token = new UsernamePasswordToken("admin", "secret");try {currentUser.login(token);System.out.println("登录成功!");} catch (AuthenticationException ae) {System.out.println("登录失败: " + ae.getMessage());}}// 6. 权限检查if (currentUser.hasRole("admin")) {System.out.println("您有admin角色");} else {System.out.println("您没有admin角色");}// 7. 权限检查if (currentUser.isPermitted("user:create")) {System.out.println("您有创建用户的权限");} else {System.out.println("您没有创建用户的权限");}// 8. 登出currentUser.logout();}
}

三、Shiro 核心概念深入

3.1 Subject 详解

Subject 是 Shiro 的核心概念,代表当前与应用交互的实体(用户、第三方服务等)。

关键方法

方法描述
getPrincipal()获取用户身份(如用户名)
getSession()获取关联的Session
login()/logout()登录/登出
isAuthenticated()是否已认证
hasRole()检查角色
isPermitted()检查权限

多线程环境中的Subject

// 在另一个线程中获取Subject
Runnable runnable = () -> {Subject subject = SecurityUtils.getSubject();// 执行操作
};
new Thread(runnable).start();

3.2 SecurityManager 解析

SecurityManager 是 Shiro 架构的核心,负责协调各安全组件。

常见实现

  • DefaultSecurityManager:默认实现
  • DefaultWebSecurityManager:Web应用专用

配置示例

// 创建Realm
Realm realm = new IniRealm("classpath:shiro.ini");// 创建SecurityManager
SecurityManager securityManager = new DefaultSecurityManager(realm);// 配置SecurityManager
SecurityUtils.setSecurityManager(securityManager);

3.3 Realm 深入

Realm 是 Shiro 与应用安全数据的桥梁,负责获取认证和授权信息。

内置Realm实现

  • IniRealm:从INI文件读取用户信息
  • JdbcRealm:从数据库读取用户信息
  • TextConfigurationRealm:内存配置
  • LdapRealm:连接LDAP服务器
  • ActiveDirectoryRealm:连接Active Directory

自定义Realm示例

public class MyRealm extends AuthorizingRealm {// 授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.getPrimaryPrincipal();SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();// 添加角色info.addRoles(getRolesFromDB(username));// 添加权限info.addStringPermissions(getPermissionsFromDB(username));return info;}// 认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {UsernamePasswordToken upToken = (UsernamePasswordToken) token;String username = upToken.getUsername();// 从数据库获取用户信息User user = getUserFromDB(username);if (user == null) {throw new UnknownAccountException("用户不存在");}// 返回认证信息return new SimpleAuthenticationInfo(user.getUsername(), // 身份user.getPassword(),  // 凭证getName()           // realm名称);}// 模拟从数据库获取角色private Set<String> getRolesFromDB(String username) {// 实际应用中应从数据库查询Set<String> roles = new HashSet<>();if ("admin".equals(username)) {roles.add("admin");roles.add("user");} else {roles.add("user");}return roles;}// 模拟从数据库获取权限private Set<String> getPermissionsFromDB(String username) {Set<String> permissions = new HashSet<>();if ("admin".equals(username)) {permissions.add("user:create");permissions.add("user:update");permissions.add("user:delete");permissions.add("user:view");} else {permissions.add("user:view");}return permissions;}// 模拟从数据库获取用户private User getUserFromDB(String username) {if ("admin".equals(username)) {return new User("admin", "secret");} else if ("user".equals(username)) {return new User("user", "password");}return null;}// 简单的User类private static class User {private String username;private String password;public User(String username, String password) {this.username = username;this.password = password;}public String getUsername() { return username; }public String getPassword() { return password; }}
}

四、Shiro 认证机制

4.1 认证流程详解

Shiro 的认证流程可以分为以下几个步骤:

  1. 收集用户身份/凭证:通常是用户名/密码
  2. 提交认证:调用 Subject.login() 方法
  3. Realm 认证:SecurityManager 委托 Realm 进行认证
  4. 成功/失败处理:返回认证结果

认证流程图

+---------------+     +----------------+     +-------------------+
|   Subject     | --> | SecurityManager| --> | Authenticator     |
+---------------+     +----------------+     +-------------------+|v+-------------------+|     Realm(s)      |+-------------------+

4.2 多种认证方式

4.2.1 用户名/密码认证
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true); // 记住我功能try {currentUser.login(token);// 认证成功
} catch (UnknownAccountException uae) {// 用户名不存在
} catch (IncorrectCredentialsException ice) {// 密码错误
} catch (LockedAccountException lae) {// 账户锁定
} catch (AuthenticationException ae) {// 其他认证错误
}
4.2.2 多Realm认证

配置多个Realm:

[main]
# 定义多个Realm
realm1 = com.example.MyRealm1
realm2 = com.example.MyRealm2# 配置认证策略
authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy# 配置SecurityManager
securityManager.realms = $realm1, $realm2
securityManager.authenticator.authenticationStrategy = $authcStrategy

认证策略

  • FirstSuccessfulStrategy:第一个成功认证的Realm即返回
  • AtLeastOneSuccessfulStrategy:至少一个Realm认证成功
  • AllSuccessfulStrategy:所有Realm都必须认证成功

4.3 记住我功能

Shiro 提供了开箱即用的"记住我"功能:

token.setRememberMe(true);

配置RememberMe

[main]
# Cookie配置
rememberMeManager = org.apache.shiro.web.mgt.CookieRememberMeManager
rememberMeManager.cookie.name = rememberMe
rememberMeManager.cookie.maxAge = 2592000 # 30天securityManager.rememberMeManager = $rememberMeManager

五、Shiro 授权机制

5.1 授权基础

Shiro 支持三种授权方式:

  1. 编程式:在代码中检查权限

    if (subject.hasRole("admin")) {// 有admin角色
    }
    if (subject.isPermitted("user:create")) {// 有创建用户的权限
    }
    
  2. 注解式:使用Java注解

    @RequiresRoles("admin")
    public void deleteUser() {// 需要admin角色才能执行
    }@RequiresPermissions("user:create")
    public void createUser() {// 需要user:create权限才能执行
    }
    
  3. 标签式(JSP/GSP):

    <shiro:hasRole name="admin"><!-- 只有admin角色能看到的内容 -->
    </shiro:hasRole><shiro:hasPermission name="user:create"><!-- 有user:create权限能看到的内容 -->
    </shiro:hasPermission>
    

5.2 权限字符串详解

Shiro 的权限字符串支持通配符和多种格式:

  1. 简单格式printer:query

    • 第一部分:资源类型(如printer)
    • 第二部分:操作(如query)
  2. 多级格式printer:query:lp7200

    • 第三部分:资源实例ID
  3. 通配符

    • printer:*:对printer的所有操作
    • printer:query:*:查询所有printer实例
    • *:query:对所有资源的查询操作

5.3 自定义授权

5.3.1 自定义Permission
public class MyPermission implements Permission {private String resource;private String action;private String instance;public MyPermission(String permissionString) {String[] parts = permissionString.split(":");this.resource = parts.length > 0 ? parts[0] : null;this.action = parts.length > 1 ? parts[1] : null;this.instance = parts.length > 2 ? parts[2] : null;}@Overridepublic boolean implies(Permission p) {if (!(p instanceof MyPermission)) {return false;}MyPermission mp = (MyPermission) p;// 检查资源是否匹配if (resource != null && !resource.equals(mp.resource)) {return false;}// 检查操作是否匹配if (action != null && !action.equals(mp.action)) {return false;}// 检查实例是否匹配if (instance != null && !instance.equals(mp.instance)) {return false;}return true;}
}
5.3.2 自定义RolePermissionResolver
public class MyRolePermissionResolver implements RolePermissionResolver {@Overridepublic Collection<Permission> resolvePermissionsInRole(String roleString) {Set<Permission> permissions = new HashSet<>();if ("admin".equals(roleString)) {permissions.add(new WildcardPermission("user:*"));permissions.add(new WildcardPermission("system:*"));} else if ("user".equals(roleString)) {permissions.add(new WildcardPermission("user:read,update"));}return permissions;}
}

六、Shiro 与 Web 集成

6.1 Shiro Filter 详解

Shiro 为 Web 应用提供了一系列 Filter:

Filter Name描述
anon匿名访问,不需要认证
authc需要认证才能访问
authcBasic基本HTTP认证
logout退出登录
noSession不创建会话
perms需要特定权限
port需要特定端口
restREST风格权限检查
roles需要特定角色
ssl需要HTTPS
user需要已认证或记住我

配置示例(web.xml)

<filter><filter-name>ShiroFilter</filter-name><filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter><filter-mapping><filter-name>ShiroFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

配置示例(shiro.ini)

[urls]
/login = authc
/logout = logout
/static/** = anon
/admin/** = authc, roles[admin]
/user/** = authc, perms["user:read"]
/** = user

6.2 会话管理

Shiro 提供了强大的会话管理功能,可以独立于容器:

Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
session.setAttribute("key", "value");
String value = (String) session.getAttribute("key");

会话配置

[main]
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager# 会话超时时间(毫秒)
sessionManager.globalSessionTimeout = 1800000 # 30分钟# 会话验证间隔
sessionManager.sessionValidationInterval = 1800000 # 30分钟securityManager.sessionManager = $sessionManager

6.3 记住我与SSO

记住我配置

[main]
rememberMeManager = org.apache.shiro.web.mgt.CookieRememberMeManager
rememberMeManager.cipherKey = base64:abc123...= # 加密密钥
securityManager.rememberMeManager = $rememberMeManager

SSO集成(以CAS为例):

[main]
casRealm = org.apache.shiro.cas.CasRealm
casRealm.casServerUrlPrefix = https://cas.example.org/cas
casRealm.applicationUrl = https://myapp.example.orgsecurityManager.realms = $casRealm

七、Shiro 高级主题

7.1 缓存集成

Shiro 支持多种缓存实现(EhCache、Redis等):

[main]
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
cacheManager.cacheManagerConfigFile = classpath:ehcache.xmlsecurityManager.cacheManager = $cacheManager

7.2 加密与哈希

Shiro 提供了强大的加密工具:

// 使用MD5哈希
String hashed = new Md5Hash("password", "salt", 2).toHex();// 使用SHA-256哈希
String hashed = new Sha256Hash("password", "salt", 1024).toBase64();// 使用BCrypt
String hashed = new BCryptPasswordEncoder().encode("password");

配置密码服务

[main]
credentialsMatcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
credentialsMatcher.hashIterations = 1024
credentialsMatcher.storedCredentialsHexEncoded = truemyRealm = com.example.MyRealm
myRealm.credentialsMatcher = $credentialsMatchersecurityManager.realms = $myRealm

7.3 并发控制

Shiro 可以控制并发登录:

[main]
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionManager.sessionDAO = $sessionDAO# 配置并发控制
concurrencyFilter = org.apache.shiro.web.filter.session.ConcurrentSessionFilter
concurrencyFilter.sessionManager = $sessionManager
concurrencyFilter.kickoutUrl = /login?kickout=1securityManager.sessionManager = $sessionManager

八、Shiro 与 Spring/Spring Boot 集成

8.1 与 Spring 集成

配置示例

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager"/><property name="loginUrl" value="/login.jsp"/><property name="successUrl" value="/home.jsp"/><property name="unauthorizedUrl" value="/unauthorized.jsp"/><property name="filterChainDefinitions"><value>/static/** = anon/login = authc/logout = logout/** = user</value></property>
</bean><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="realm" ref="myRealm"/>
</bean><bean id="myRealm" class="com.example.MyRealm"><property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean><bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.Sha256CredentialsMatcher"><property name="hashIterations" value="1024"/>
</bean><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

8.2 与 Spring Boot 集成

依赖配置

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.9.0</version>
</dependency>

配置类

@Configuration
public class ShiroConfig {@Beanpublic ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();factoryBean.setSecurityManager(securityManager);Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();filterChainDefinitionMap.put("/static/**", "anon");filterChainDefinitionMap.put("/login", "authc");filterChainDefinitionMap.put("/logout", "logout");filterChainDefinitionMap.put("/**", "user");factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);factoryBean.setLoginUrl("/login");factoryBean.setSuccessUrl("/home");factoryBean.setUnauthorizedUrl("/unauthorized");return factoryBean;}@Beanpublic SecurityManager securityManager(Realm realm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(realm);return securityManager;}@Beanpublic Realm realm() {MyRealm realm = new MyRealm();realm.setCredentialsMatcher(credentialsMatcher());return realm;}@Beanpublic CredentialsMatcher credentialsMatcher() {return new Sha256CredentialsMatcher();}@Beanpublic static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}
}

九、Shiro 最佳实践

9.1 安全最佳实践

  1. 密码安全

    • 始终使用加盐哈希
    • 使用强哈希算法(如SHA-256、BCrypt)
    • 避免使用弱密码
  2. 会话安全

    • 使用HTTPS保护会话
    • 设置合理的会话超时
    • 防止会话固定攻击
  3. 权限设计

    • 遵循最小权限原则
    • 使用RBAC(基于角色的访问控制)模型
    • 定期审查权限分配

9.2 性能优化

  1. 缓存策略

    • 缓存认证和授权信息
    • 使用分布式缓存(如Redis)用于集群环境
  2. 会话管理

    • 对于无状态API,考虑禁用会话
    • 优化会话持久化策略
  3. Realm优化

    • 批量获取权限信息
    • 避免重复查询数据库

9.3 常见问题解决

  1. ClassCastException

    • 确保Subject绑定到正确的线程
    • 检查类加载器问题
  2. 权限不生效

    • 检查权限字符串格式
    • 确认Realm正确配置
    • 检查缓存是否过期
  3. 会话丢失

    • 检查集群配置
    • 确认会话持久化配置正确

十、总结

Apache Shiro 作为一个功能全面而又简单易用的安全框架,为Java应用提供了强大的安全保障。通过本文的学习,我们了解了:

  1. Shiro 的核心概念和架构设计
  2. 认证和授权的实现原理
  3. Web集成和会话管理
  4. 与Spring/Spring Boot的集成
  5. 高级特性和最佳实践

无论是简单的Web应用还是复杂的企业级系统,Shiro都能提供合适的安全解决方案。希望本文能成为你Shiro学习之旅的有力参考,帮助你在实际项目中构建更加安全可靠的系统。


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

相关文章:

Apache Shiro 全面指南:从入门到高级应用

一、Shiro 概述与核心架构 1.1 什么是 Shiro&#xff1f; Apache Shiro 是一个强大且易用的 Java 安全框架&#xff0c;它提供了认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、加密&#xff08;Cryptography&#xff09;和会话管…...

高速电路中的存储器应用与设计三

4 DDR2 SDRAM 介绍及其应用要点 1. DDR2 SDRAM 概述 DDR2&#xff08;Double Data Rate 2&#xff0c;两倍数据速率&#xff0c;版本 2&#xff09;SDRAM&#xff0c;是由 JEDEC 国际标准组织开发的、基于 DDR SDRAM 的、升级的存储技术。与 DDR SDRAM 相比&#xff0c;虽然其…...

AndroidStudio无法识别连接夜神模拟器

下载夜神模拟器&#xff1a; https://www.yeshen.com/ 启动之后发现AS关联不了夜神模拟器&#xff0c;需要做如下的操作。 1&#xff1a;复制配置文件进入夜神模拟器 adb 相关的更改&#xff1a; 开启的命令是&#xff1a; 端口启动 固定&#xff1a; 夜神模拟器&#xff…...

Go 语言标准库中database模块详细功能介绍与示例

Go语言的标准库 database/sql 提供了与 SQL 数据库交互的通用接口&#xff0c;但需要搭配具体的数据库驱动&#xff08;如 MySQL、PostgreSQL 等&#xff09;使用。以下是 database/sql 的核心方法及示例说明&#xff1a; 1. 连接数据库 sql.Open(driverName, dataSourceName)…...

ai-api-union项目,适配各AI厂商api

项目地址&#xff1a;alpbeta/ai-api-union 需求&#xff1a;实现兼容各大模型厂商api的流式对话和同步对话接口&#xff0c;本项目现兼容智谱、豆包、通义、通义版deepseek 设计 一个ChatController类对外暴露这两个接口&#xff0c;入参都为ChatRequest请求类&#xff0c;…...

进程间通信——信号量

进程间通信——信号量 目录 一、基本概念 1.1 概念 1.2 基本操作 1.3 相关函数 1.3.1 semget创建/获取 1.3.2 semop操作信号量 1.3.3 semctl初始化/删除 二、代码操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…...

CSS 如何设置父元素的透明度而不影响子元素的透明度

CSS 如何设置父元素的透明度而不影响子元素的透明度 在 CSS 中&#xff0c;设置父元素的透明度&#xff08;如通过 opacity 属性&#xff09;会影响所有子元素的透明度&#xff0c;因为 opacity 是作用于整个元素及其内容的。如果想让父元素透明但不影响子元素的透明度&#x…...

SpringBean模块(一)定义如何创建生命周期

一、介绍 1、简介 在 Spring 框架中&#xff0c;Bean 是指由 Spring 容器 管理的 Java 对象。Spring 负责创建、配置和管理这些对象&#xff0c;并在应用程序运行时对它们进行依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;。 通俗地讲&#xff0c;Sp…...

2007-2019年各省地方财政一般公共服务支出数据

2007-2019年各省地方财政一般公共服务支出数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政一般公共服务支出 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政一般公共服务…...

S32K144外设实验(六):FTM输出单路PWM

文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 1.1 时钟系统 FTM的CPU接口时钟为SYS_CLK,在RUN模式下最高80MHz。模块的时钟结构如下图所示。 从上图中可以看出,FTM模块的功能时钟为SYS_CLK,…...

二层综合实验

拓扑图 实验要求 1.内网IP地址使用172.16.6.0/16分配 2.sw1和sW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有电脑可以正常访问IsP路由器环回 实验思路 这是一个二层综合实验每当拿到一个实验看清楚要求之后都有…...

《深度剖析SQL之WHERE子句:数据过滤的艺术》

在当今数据驱动的时代&#xff0c;数据处理和分析能力已成为职场中至关重要的技能。SQL作为一种强大的结构化查询语言&#xff0c;在数据管理和分析领域占据着核心地位。而WHERE子句&#xff0c;作为SQL中用于数据过滤的关键组件&#xff0c;就像是一把精准的手术刀&#xff0c…...

Python每日一题(7)

Python每日一题 2025.3.27 一、题目二、分析三、自己源代码四、deepseek答案五、源代码与ai分析 一、题目 question["""编写程序,生成包含20个随机数的列表,然后将前十个元素升序排列,后10个元素降序排列,并输出结果""" ]二、分析 今天本来写了…...

Linux命令大全:从入门到高效运维

适合人群&#xff1a;Linux新手 | 运维工程师 | 开发者 目录 一、Linux常用命令&#xff08;每天必用&#xff09; 1. 文件与目录操作 2. 文件内容查看与编辑 二、次常用命令&#xff08;按需使用&#xff09; 1. 系统管理与监控 2. 网络与通信 3. 权限与用户管理 三、…...

Xss复现

目录 前提&#xff1a; 1.什么是XSS 2.XSS 的三种主要类型 复现 第1关 第2关 前提&#xff1a; 1.什么是XSS XSS&#xff08;跨站脚本攻击&#xff0c;Cross-Site Scripting&#xff09; 是一种常见的 Web 安全漏洞&#xff0c;攻击者通过向网页注入恶意脚本&#xff…...

3.28学习总结

完成分割回文串的算法题&#xff0c;难点主要在如何去分割&#xff0c;靠什么去分割字符串 int a(char arr[]){int i,j;int lenstrlen(arr);for(i0,jlen-1;i<j;i,j--){if(arr[i]!arr[j]) return 0;}return 1;}char **path;int pathtop;char***reasult;int*ansize;int count…...

【MySQL基础】数据库及表基本操作

作为运维工程师&#xff0c;掌握MySQL的基础操作是日常工作的重要技能之一。本文将介绍MySQL中数据库和表的基本操作&#xff0c;帮助您快速上手或复习这些核心概念。 1 数据库基本操作 1.1 创建数据库 create database db_name; -- 指定字符集和排序规则 create database d…...

注意!ChatGPT 全新 AI 图像功能延迟对免费用户开放

2025 年 3 月 25 日&#xff0c;OpenAI 正式宣布在 ChatGPT 中推出基于 GPT-4o 模型的全新原生图像生成功能。 这一功能允许用户通过对话生成和编辑图像&#xff0c;支持从写实风格到插图风格的多种形式。OpenAI 首席执行官萨姆・奥特曼&#xff08;Sam Altman&#xff09;在社…...

玛哈特液压式精密矫平机——以精准压力,定义金属的绝对服从

板材应力不除&#xff0c;良率难升。液压式精密矫平机&#xff0c;凭借多级液压闭环技术AI动态补偿算法&#xff0c;攻克0.2mm超薄钛箔至65mm装甲钢板的矫平极限&#xff0c;平整度精度锁定0.012mm&#xff0c;残余应力≤3MPa&#xff0c;让金属从“形似平整”迈向“分子级稳定…...

HCIA【NAT】

目录 1 NAT产生背景 2 NAT作用 3 NAT分类 NAT&#xff08;网络地址转换技术&#xff09; 1 NAT技术产生背景 [1] IPV4地址不够用 [2] 处于IPV4到IPV6的一个过渡阶段&#xff0c;IPV6地址还没有完全普及 2 作用 [1] 解决IP地址不够用的问题 [2] 做公网和私网地址的转换 …...

Reactor 事件流 vs. Spring 事件 (ApplicationEvent)

Reactor 事件流 vs. Spring 事件 ApplicationEvent Reactor 事件流 vs. Spring 事件 (ApplicationEvent)1️⃣ 核心区别2️⃣ Spring 事件 (ApplicationEvent)✅ 示例&#xff1a;Spring 事件发布 & 监听1️⃣ 定义事件2️⃣ 发布事件3️⃣ 监听事件&#x1f539; 进阶&…...

Google开源机器学习框架TensorFlow探索更多ViT优化

一、在边缘设备优化ViTa 在边缘设备上优化 ViT&#xff08;Vision Transformer&#xff09;模型&#xff0c;主要目标是减少计算量、降低功耗、提升推理速度。以下是几种关键优化策略&#xff1a; 1.轻量级 ViT 变体 部分 ViT 变体专为边缘设备优化&#xff0c;包括&#xf…...

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…...

火山dts迁移工具使用

登录后选择生态工具。&#xff08;数据库传输服务DTS) 先选region 创建迁移任务 假设&#xff0c;mysql 选择专有网络(一般上云到火山都是专有网络&#xff09; 【先选】结构迁移&#xff0c;全量&#xff0c;这些 【再选】迁移对象 &#xff08;他们产研有bug&#xff0c;先…...

Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)

1. brew安装 mac需要先安装brew&#xff0c;如果本地已经安装过brew这一步可以忽略&#xff0c;遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败&#xff0c;因为…...

Go 语言标准库中time模块详细功能介绍与示例

以下是 Go 语言 time 模块的详细说明及示例&#xff0c;涵盖时间操作、定时器、时区处理等核心功能&#xff1a; 一、时间基础操作 1. 获取时间 // 当前本地时间 now : time.Now() fmt.Println(now) // 2023-08-04 15:30:45.123456 0800 CST// 构造指定时间 t : time.Date(20…...

做的一些实验

先在DRMPlane::Perform函数里&#xff0c;把PLANE_SET_SRC_RECT或者PLANE_SET_DST_RECT设置的DRMProperty::SRC_W DRMProperty::SRC_H或者DRMProperty::CRTC_W DRMProperty::CRTC_H设置为原来1/2&#xff0c;都无法启动Android界面。 后来思考了一下&#xff0c;Log里好像打印…...

计算机网络基础:网络流量工程与优化策略

计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…...

Python入门学习笔记 - 从环境搭建到基础语法

一、前期准备工作 1. 系统环境配置 防火墙设置与网络连接检查 2. 网络查看 二、计算机基础知识 1. 硬件系统 2. 计算机系统组成 三、Python简介 1. Python的特点 2. Python安装注意事项 四、Python基础语法 1. 注释的分类 2. IDE使用技巧 字体大小随滚轮滑动设置 3.…...

重温:时间窗口与滑动步长的概念

核心概念 窗口大小&#xff08;Window Size&#xff09; 定义窗口包含的时间步数&#xff08;如过去7天、24小时等&#xff09;。例如&#xff0c;窗口大小为5时&#xff0c;每个窗口包含连续的5个时间点数据。 滑动步长&#xff08;Step/Stride&#xff09; 窗口每次向前移动…...

数据库——MySQL字符、日期函数

一、字符函数详解 1. CONCAT() - 字符串拼接 作用&#xff1a;连接多个字符串&#xff0c;类似Java中的号。 语法&#xff1a; CONCAT(string1, string2, ...) 示例&#xff1a; SELECT CONCAT(Hello, , World) AS greeting; -- 输出&#xff1a;Hello World 2. UPPER()…...

Vue3.5 企业级管理系统实战(十一):全屏切换组件

本篇主要探讨如何在导航栏&#xff08;Navbar&#xff09;中添加全屏切换按钮&#xff0c;并借助功能强大的 screenfull 插件&#xff0c;丝滑实现全屏切换功能&#xff0c;为用户打造更为便捷、流畅的交互体验。 1 安装插件 screenfull screenfull 是一个轻量级的 JavaScript…...

HAL_UARTEx_ReceiveToIdle_DMA 开启,但是无法进入空闲中断;

HAL_UART_Receive_IT HAL_UARTEx_ReceiveToIdle_DMA 解决措施&#xff0c;关闭HAL_UART_Receive_IT函数&#xff1b; 因为这个函数会开启start_receive 函数中断&#xff0c;这个函数 将标志位一直置busy&#xff0c;导致一直没有进入空闲中断设置&#xff1b;...

第30周Java分布式入门 分布式基础

分布式基础课程笔记 一、什么是分布式&#xff1f; 1. 权威定义 分布式系统定义为&#xff1a;“利用物理架构形成多个自治的处理元素&#xff0c;不共享主内存&#xff0c;通过发送消息合作”。 2. 核心解释 物理架构与处理元素 &#x1f31f; 多台独立服务器/电脑&#x…...

【商城实战(82)】区块链赋能用户身份验证:从理论到源码实践

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

一周掌握Flutter开发--9. 与原生交互(上)

文章目录 9. 与原生交互核心场景9.1 调用平台功能&#xff1a;MethodChannel9.1.1 Flutter 端实现9.1.2 Android 端实现9.1.3 iOS 端实现9.1.4 使用场景 9.2 使用社区插件9.2.1 常用插件9.2.2 插件的优势 总结 9. 与原生交互 Flutter 提供了强大的跨平台开发能力&#xff0c;但…...

DeepSeek-V3-0324对比OpenAI GPT-4o和Gemini 2.5 Pro

以下是DeepSeek-V3-0324、OpenAI GPT-4o与谷歌Gemini 2.5 Pro模型的更新点及优化对比总结&#xff1a; 1. DeepSeek-V3-0324 开源地址&#xff1a;https://huggingface.co/deepseek-ai/DeepSeek-V3-0324 核心更新与优化 性能提升&#xff1a; 采用6850亿参数MoE架构&#xff…...

【AI论文】LEGO拼图:大型语言模型在多步骤空间推理方面的表现如何?

摘要&#xff1a;多步骤空间推理涉及跨多个顺序步骤理解和推理空间关系&#xff0c;这对于解决复杂的现实世界应用至关重要&#xff0c;如机器人操作、自主导航和自动化装配。为了评估当前多模态大型语言模型&#xff08;MLLMs&#xff09;在获取这一基本能力方面的表现&#x…...

【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署

【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…...

vcpkg安装指定版本的库

一.vcpkg安装 使用git将vcpkg源码克隆到本地制定目录&#xff08;D:\vcpkg&#xff09;&#xff0c;并初始化 git clone https://github.com/microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh # Linux/macOS .\bootstrap-vcpkg.bat # Windows 如下图&#xff1a; 二.安…...

springboot 四层架构之间的关系整理笔记五

问题&#xff1a;service 和 多个serviceimpl 分层之间的逻辑关系&#xff1f; 好的&#xff01;用班级活动的例子继续讲&#xff0c;假设班长&#xff08;Service接口&#xff09;要管理多种任务&#xff0c;而不同的班委&#xff08;ServiceImpl实现类&#xff09;负责不同场…...

记录一次交易耗时有毛刺TDSQL数据库排查过程

信息同步非常重要&#xff0c;解决问题前&#xff0c;务必从应用获取实例信息、sql关键字、问题时间段、问题描述。 处理步骤&#xff1a; 1、登陆赤兔&#xff0c;打开实例监控信息&#xff0c;检查CPU、内存、IO、缓冲命中率、proxy汇总请求量耗时情况&#xff0c;初步判断…...

爱普生晶体单元FC2012AN在5G RedCap中的应用

在 5G 技术向物联网领域深度渗透的今天&#xff0c;RedCap&#xff08;5G 轻量化&#xff09;作为衔接中高速物联网场景的关键技术&#xff0c;正加速推动工业、医疗、可穿戴等领域的智能化升级。爱普生 FC2012AN 低 ESR 晶体单元凭借其突破性的小尺寸、低功耗与高稳定性设计&a…...

Linux: 网络,arp的数量为什么会对交换机/路由器有性能的影响

这个问题也是非常普遍的问题。比如最近比较火的一个OVS相关的问题: ARP request packets put high pressure on the pinctrl thread in ovn-controller 另一个在工作种也遇到了相似的问题,当一个网络里发了同时发了小一百个GARP之后,路由器的gateway就会有ARP处理延迟。 A…...

javaWeb vue的简单语法

一、简介 两大核心优势&#xff1a; 声明式渲染&#xff1a;Vue 基于标准 HTML 拓展了一套模板语法&#xff0c;使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。 响应性&#xff1a;Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 D…...

Android 中隐藏标题栏和状态栏的方法

在Android开发中&#xff0c;隐藏标题栏和状态栏是实现全屏显示的常见需求。 一、隐藏标题栏 1、通过代码隐藏 对于继承自 AppCompatActivity 的 Activty&#xff0c;可在 onCreate() 方法中调用supportRequestWindowFeature 或 getSupportActionBar 方法来隐藏标题栏。 ove…...

Tof 深度相机原理

深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术&#xff1a;原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机&#xff08;二&#xff09;——飞行时间&#xff08;TOF&#xff09;_飞行时间技术-C…...

boost.asio

as&#xff08;async&#xff09;:异步 同步io&#xff1a; reactor (非阻塞)&#xff08;需要注册一次&#xff0c;在等待消息时可以干别的事&#xff09; 阻塞io网络模型 接口&#xff1a;read\accept\connect\write 接口返回时&#xff0c;io完成 异步…...

Python 装饰器(Decorators)

什么是装饰器&#xff1f; 装饰器&#xff08;Decorator&#xff09;本质上是一个 修改其他函数功能的函数。它的核心思想是&#xff1a;不修改原函数代码&#xff0c;动态添加新功能。比如&#xff1a; 记录函数执行时间 检查用户权限 缓存计算结果 自动重试失败操作 理解…...

django orm的优缺点

Django ORM&#xff08;对象关系映射&#xff09;是 Django 框架的核心组件之一&#xff0c;它通过将数据库表映射为 Python 类&#xff0c;简化了数据库操作。以下是其优缺点总结&#xff1a; 优点 开发效率高 用 Python 类定义数据模型&#xff0c;无需手写 SQL&#xff0c…...