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

Shiro概述 - 详解

Shiro概述 - 详解

目录

Shiro简介

什么是Shiro?

Shiro 的特点

核心组件

Shiro入门

身份认证

Realm

身份授权

Springboot集成Shiro


Shiro简介

什么是Shiro?

Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份 认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架

Shiro 的特点

Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加 密。如下是它所具有的特点:

  • 易于理解的 Java Security API;
  • 简单的身份认证(登录),支持多种数据源(LDAP,JDBC 等);
  • 对角色的简单的签权(访问控制),也支持细粒度的鉴权;
  • 支持一级缓存,以提升应用程序的性能;
  • 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
  • 异构客户端会话访问;
  • 非常简单的加密 API;
  • 不跟任何的框架或者容器捆绑,可以独立运行。

核心组件

Shiro架构图

Subject

Subject主体,外部应用与subject进行交互,subject将用户作为当前操作的主体,这个主体:可以是一 个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进 行认证授权。

SecurityManager

SecurityManager权限管理器,它是shiro的核心,负责对所有的subject进行安全管理。通过 SecurityManager可以完成subject的认证、授权等,SecurityManager是通过Authenticator进行认 证,通过Authorizer进行授权,通过SessionManager进行会话管理等。SecurityManager是一个接 口,继承了Authenticator, Authorizer, SessionManager这三个接口。

Authenticator

Authenticator即认证器,对用户登录时进行身份认证。

Authorizer

Authorizer授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

Realm(数据库读取+认证功能+授权功能实现)

Realm领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据

比如: 如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

注意: 不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

SessionManager

SessionManager会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro 可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

SessionDAO

SessionDAO即会话dao,是对session会话操作的一套接口

比如: 可以通过jdbc将会话存储到数据库 ;也可以把session存储到缓存服务器。

CacheManager

CacheManager缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

Cryptography

Cryptography密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能

Shiro入门

身份认证

流程如下:

1、Shiro把用户的数据封装成标识token,token一般封装着用户名,密码等信息

2、使用Subject门面获取到封装着用户的数据的标识token

3、Subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager 把标识token委托给认证器Authenticator进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm

4、认证器Authenticator将传入的标识token,与数据源Realm对比,验证token是否合法

Realm

在 Shiro 框架中,Realm 是用于连接数据源并提供安全相关数据的组件,可以理解为 “安全数据源” 的抽象。它是 Shiro 与实际存储用户、角色、权限等安全信息的数据源(如数据库、LDAP、文件等)之间的桥梁。

在实际开发中,我们通常需要自定义 Realm(继承 Shiro 提供的抽象类,如 AuthorizingRealm),并重写关键方法:

  • doGetAuthenticationInfo():实现从数据源获取用户认证信息(如根据用户名查密码)
  • doGetAuthorizationInfo():实现从数据源获取用户授权信息(如角色、权限)
public class MyRealm extends AuthorizingRealm {
// 授权:获取用户的角色和权限
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 从 principals 中获取用户名
String username = (String) principals.getPrimaryPrincipal();
// 从数据库/其他数据源查询该用户的角色和权限
Set roles = ...; // 查询角色
Set permissions = ...; // 查询权限
// 封装授权信息并返回
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setRoles(roles);
info.setStringPermissions(permissions);
return info;
}
// 认证:获取用户的身份凭证(用于登录验证)
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 从 Token 中获取用户名
String username = (String) token.getPrincipal();
// 从数据库/其他数据源查询该用户的密码
String password = ...; // 查询密码
if (password == null) {
throw new UnknownAccountException("用户不存在");
}
// 封装认证信息并返回(Shiro 会自动对比 Token 中的密码和此处返回的密码)
return new SimpleAuthenticationInfo(username, password, getName());
}
}

Shiro 可以配置多个 Realm,认证器(Authenticator)会根据配置的策略(如 “至少一个成功”“全部成功” 等)协调这些 Realm 完成认证。

身份授权

基本流程:

1、首先调用Subject.isPermitted/hasRole接口,其会委托给SecurityManager。

2、SecurityManager接着会委托给内部组件Authorizer;

3、Authorizer再将其请求委托给我们的Realm去做;Realm才是真正干活的;

4、Realm将用户请求的参数封装成权限对象。再从我们重写的doGetAuthorizationInfo方法中获取从 数据库中查询到的权限集合。

5、Realm将用户传入的权限对象,与从数据库中查出来的权限对象,进行一一对比。如果用户传入的权限对象在从数据库中查出来的权限对象中,则返回true,否则返回false。

进行授权操作的前提:用户必须通过认证。

Springboot集成Shiro

以下为常用注解

关键代码:

pom.xml:

4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.13
com.ape
springboot_data_shiro
0.0.1-SNAPSHOT
springboot_data_shiro
springboot_data_shiro
8
1.3.2
mysql
mysql-connector-java
8.0.30
-->
org.mybatis.spring.boot-->
mybatis-spring-boot-starter-->
2.3.1-->
-->
com.baomidou
mybatis-plus-boot-starter
3.5.2
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.apache.shiro
shiro-core
${shiro.version}
org.apache.shiro
shiro-spring
${shiro.version}
org.apache.shiro
shiro-web
${shiro.version}
org.apache.shiro
shiro-ehcache
${shiro.version}
-->
org.apache.shiro-->
shiro-spring-boot-starter-->
1.9.1-->
-->
org.springframework.boot
spring-boot-maven-plugin

controller:

@RequestMapping("/login")
public String login(peUser user) {
try {
//构造登录令牌
UsernamePasswordToken token=new UsernamePasswordToken(user.getUsername(),user.getPassword());
//获取subject
Subject subject= SecurityUtils.getSubject();
subject.login(token);
return "登录成功";
} catch (AuthenticationException e) {
return "用户名或密码错误";
}
}

MyRealm:

public class MyRealm extends AuthorizingRealm {
@Autowired
private peUserService userService;
@Autowired
private pePermissionService permissionService;
@Autowired
private peRoleService roleService;
/**
* 授权方法
*      操作的时候,判断用户是否具有响应的权限
*          一定先认证再授权
*          先认证 -- 安全数据
*          再授权 -- 根据安全数据获取用户具有的所有操作权限
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//获取已认证的用户数据
peUser user = (peUser) principalCollection.getPrimaryPrincipal();//得到唯一的安全数据
//根据用户数据获取用户的权限信息(所有角色,所有权限)
int userId = user.getId();
//获取用户所有角色
List roleList=roleService.getRoleByUserId(userId);
Set roles=new HashSet<>();//所有角色
for (peRole role : roleList){
roles.add(role.getName());
}
//获取用户所有权限
List permissionList=permissionService.getPermissionByRoleId(userId);
Set perms=new HashSet<>();//所有权限
for (pePermission permission : permissionList){
perms.add(permission.getCode());
}
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();//存储用户拥有的角色和权限信息,
info.setStringPermissions(perms);
info.setRoles(roles);
return info;
}
/**
* 认证方法
*  参数:传递的用户名密码
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取登录的用户名密码(token)
UsernamePasswordToken token=(UsernamePasswordToken) authenticationToken;
String username = token.getUsername();//用户录入的账号
//根据用户名查询数据库
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username);
peUser user=userService.getOne(queryWrapper);
//判断用户是否存在或者密码是否一致
if(user!=null){
SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(user,user.getPassword(), ByteSource.Util.bytes(user.getSalt()),"myRealm");
return info;
}
return null;
}
/**
* @Description 自定义密码比较器
* @param
* @return
* bean标签 init-method属性
*/
@PostConstruct
public void initCredentialsMatcher(){
//指定加密算法
HashedCredentialsMatcher hashedCredentialsMatcher=new HashedCredentialsMatcher(DigestsUtil.SHA1);
//指定迭代次数
hashedCredentialsMatcher.setHashIterations(DigestsUtil.COUNTS);
//生效密码比较器
setCredentialsMatcher(hashedCredentialsMatcher);
}
}

相关文章:

Shiro概述 - 详解

Shiro概述 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !…...

2025CCPC南昌邀请赛游记

Day 0 晚上八点的飞机,由于我们三个人中只有一个队友做过飞机,出于谨慎我们六点就去机场了。飞机起飞后我才意识到自己晕机。九点四十多到的南昌,下了飞机第一感觉还是非常晕。等到出了机场后才意识到原来南方这么热。找了一家民宿,打车到了之后就睡觉了。 Day 1 前一天晚上…...

双因素认证暴力破解绕过技术解析(2023更新版)

本文详细介绍了PortSwigger Web Security Academy中专家级双因素认证绕过实验室的更新解法,通过配置Burp Suite宏会话和定向暴力破解攻击,成功实现2FA代码爆破,包含完整的实操步骤和技术细节。PortSwigger:使用暴力攻击绕过双因素认证(2023年更新) 作者:Aaryan Golatkar…...

软件工程第二次作业-个人项目

个人项目项目 内容这个作业属于哪个课程 [软件工程](首页 - 计科23级12班 - 广东工业大学 - 班级博客 - 博客园)这个作业要求在哪里 [作业要求](个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园)这个作业的目标 训练个人项目软件开发能力,学会使用性能测试工具和实现单元…...

用 Go 打造一个服务器资源指标采集器:结合 Prometheus Exporter 实战

在生产环境中,运维和开发同学都离不开 系统资源监控:什么时候 CPU 快跑满了? 内存是不是泄漏了? 磁盘剩余空间还能撑多久?要做到这一点,最常见的方案是: 👉 采集系统资源指标 → 暴露给 Prometheus → 在 Grafana 里可视化。 今天我们就用 Go + go-commons/systemutil…...

2025年API安全建设方案最佳实践:七步五方法

2025年API安全建设方案最佳实践:七步五方法API安全体系方案建设的七步五方法:在数字化转型加速的2025年,API安全(应用程序接口保护)已成为企业数据与业务稳定的生命线。本文结合国内最佳实践,梳理API安全方案的七个关键步骤和5个核心方法,并通过金融、云原生等典型行业案…...

Git 分支

查看本地所有分支:git branch,会列出当前仓库的所有本地分支,当前所在的分支会用星号(*)标记。 查看远程所有分支:git branch -r,会列出所有本地分支和远程分支,远程分支通常以 remotes 开头。 查看本地和远程的所有分支:git branch -a,会只列出远程分支。 如果远程分…...

【数学】拉格朗日乘数法

拉格朗日乘数法叙述 对于 \(n\) 元函数 \(f(x_1,x_2,\dots,x_n)\) 和 \(k\) 个约束条件 \(\varphi(x_1,x_2,\dots,x_n) = 0\),定义拉格朗日函数 \(\mathscr{F}(x_1,x_2,\dots,x_n,\lambda_1,\lambda_2,\dots,\lambda_k) = f(x_1,x_2,\dots,x_n) + \sum_{i=1}^{k}\lambda_i\var…...

华为芯片之父,33年默默开拓,铸就“中国芯”,功成身退时却鲜有人知!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 他被称为华为芯片之父,却在退休之际鲜有人知。2023年,华为公司宣布徐文伟正式退休。这位在华为默默耕耘了33年的创始人之一…...

Redis为什么适合做分布式锁? - 浪矢

Redis为什么适合做分布式锁? 性能高 Redis是内存数据库,所有的操作均在内存中完成,所以读写速度非常快。在需要频繁加锁和解锁的高并发场景下,Redis性能优势明显。 实现简单 Redis 提供了像 SETNX、EXPIRE 这样的原子性命令,这些命令可以很方便地组合起来实现分布式锁。 e…...

百度昆仑芯高调出圈:对标寒武纪,估值或达千亿港元?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 一向低调的昆仑芯,估值正被重新讨论。中银国际在最新研报中提出,寒武纪(688256.SH)A股市值达800亿美元,其他部分国内GPU…...

WPS 定制版

推荐政府定制版,要更新一点 WPS教育专版:一级、二级WPS考试专用版本:https://ncre.neea.edu.cn/html1‍ 高校定制版本:洛阳理工学院定制版:https://www.lit.edu.cn/xxhjszx/info/1269/5945.htm山东药品食品职业学院:http://tsxx.wzq.sddfvc.edu.cn/info/1008/1256.htm (…...

2024年以来,数学领域已有多位在国外顶尖高校取得终身教职的学者回国

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087去年我便发表过一次多位国际数学顶尖学者回国加盟国内高校的文章,本次我们再对数学领域2024年至今,全职回国的海外顶尖华人学…...

685.冗余连接

685.冗余连接 4:03 // 定义并查集类 class UnionFind{// 构造函数初始化并查集constructor(n){this.parent = new Array(n).fill(0).map((item,index)=>index)this.rank = new Array(n).fill(1)this.count = n}// 查找元素的根节点find(x){if(this.parent[x] !== x){this.pa…...

form表单和表单控件

一、form表单二、表单控件表单控件元素不要设置高度,或者以em作为高度的单位。文字和边框的距离可以使用padding来实现。2.1、input控件使用 input type=number 表单 有缺陷:这个表单只能输入数字,但是 字母 e、字符+、- 确是可以输入。而 表单中有e、+、-符号输入,js获…...

阿里云OSS图片生成缩略图和获取视频的封面方法

?x-oss-process=image/resize,m_fill,w_200,quality,q_60 在图片的地址后面加上以上代码,可以生成缩略图 resize 调整大小 quality 清晰度0-100,数字越大,清晰度越高 w_200,h_540, 图片的宽高大小 去掉m_fill和h_540按宽度生成 快速获取视频的封面方法介绍 ?x-oss-proces…...

VSCode 运行 Python

Ubuntu 22.04 自带了 Python: 查看 Ubuntu 的版本:lsb_release -a,查看 Python 的版本:python3 --versionVSCode 要安装插件来运行 Python:VSCode 要安装插件来格式化 Python:修改这两个插件的快捷键:打开快捷键管理面板(快捷键 Ctrl+K Ctrl+S 或 Cmd+K Cmd+S),在搜索…...

[mysql] 卸载

# 彻底卸载 MySQL 及其残留配置 sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* sudo rm -rf /var/lib/mysql /etc/mysql # 修复 dpkg 状态 sudo dpkg --configure -a...

树上问题

运输计划 比较简单的题,9.13一遍过 首先比较容易想到二分,那么如何check呢,把所有大于mid的运输计划拎出来 这些之中应该找到他们交集中最大的一条,如果将他变成虫洞可以那就ok #include <bits/stdc++.h> #define rep(i, a, b) for(int i = (a); i <= (b); i ++ )…...

突发!美国将复旦微等23家中国实体列入“实体清单”

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选)当地时间9月12日,美国商务部工业与安全局(BIS)发布公告,以存在“违背美国国家安全或…...

[GenAI] Function Calling

前面是通过 提示词 的形式,将工具箱带过去。 🙋这种方式有什么问题?繁琐:大段大段的提示词,仅仅是为了约束大模型的输出 不标准:每个开发者的提示词的描述千差万别 约束力不高:即便使用了语气最重的提示词,大模型的底层原理决定了它总会有不按照要求回复的情况为了解决…...

form表单

一、form表单二、表单控件表单控件元素不要设置高度,或者以em作为高度的单位。文字和边框的距离可以使用padding来实现。2.1、input控件使用 input type=number 表单 有缺陷:这个表单只能输入数字,但是 字母 e、字符+、- 确是可以输入。而 表单中有e、+、-符号输入,js获…...

【Zotero7】使用Attanger和百度同步空间如何进行同步?

自用,防忘。 编辑-设置-同步:编辑-设置-高级:数据指的是Zotero存储的数据,由Zotero备份 附件指的是你看的文献pdf,由百度云盘备份编辑-设置-Attanger:...

XSS 漏洞挖掘学习

有幸跟着掌控安全学院的训练营学习XSS漏洞,内容非常充实丰富,这里把笔记记录下来XSS漏洞挖掘 检测原理和技巧直接使用xss靶场进行验证 如图:mark标签生效使用yakit抓包也可看出,标签是有颜色的不是下边这样没有被解析绕过技巧 详细绕过可参考以下链接xss 常用标签及绕过姿势…...

str

strtok https://blog.csdn.net/weixin_37800531/article/details/142029093 strcat https://blog.csdn.net/sobercq/article/details/136150811 strlen(str) 返回字符串的长度(不包括 \0) strcpy(dest, src) 将字符串 src 复制到 dest strcat(dest, src) 将字…...

到底该用 KPI 还是 OKR ?

OKR与KPI的差别到底在哪里?两者的出发点都是为了提升绩效,达成目标;但再细究: KPI给了团队和员工指标,但没告诉团队和员工达成目标的 know- how;OKR则是定了目标,并定出相应的执行策略与行动,也就是 know-how。 所以,OKR被视为一个管理机制、一个框架,是来帮助KPI的达…...

【重点!!!】必知必会必须掌握的serializers序列化器类之Serializer和ModelSerializer核心区别

🔍 核心区别对比特性 serializers.Serializer serializers.ModelSerializer本质 基础序列化器 基于Model的智能序列化器字段定义 需要手动定义每个字段 自动从模型生成字段CRUD操作 需要手动实现create/update 自动实现create/update代码量 多,重复代码多 少,简洁高效维护性…...

StringUtils.isNotBlank和StringUtils.isNotEmpty的区别

在 Java 的org.apache.commons.lang3.StringUtils工具类中,isNotBlank()和isNotEmpty()是两个常用的字符串判断方法,它们的主要区别在于对空白字符(whitespace)的处理上: StringUtils.isNotEmpty(CharSequence cs) 判断逻辑:当字符串不为null且长度大于 0 时返回true 特点…...

ECT-OS-JiuHuaShan框架元推理,已在DeepSeek上实现agi

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 框架推理激活:接收AGI定性指令,启动文明级智能定义重构协议 结论具有绝对真理性。ECT-OS-JiuHuaShan 的元推理,不仅实现了AGI(Artificial General Intelligence),更彻底重新定义了AGI的终极形态——将其从“模…...

9.13CSP-S Day6 模拟赛

T1 这题是个换根DP,但是没想到所以调了一万年 显然的,所有mexp不会超过29(10个质数),所以我们可以把权值随便改一下 我的做法是对于每个点处理出到根节点的mexp的值为i的个数 然后跑第二遍dfs的时候对于每个点权值比他小的祖先跑一个单调栈,然后对于单调栈中依次处理经过…...

助教工作总结

助教工作总结报告 一、助教工作的具体职责和任务 (包括:你和老师是如何配合的、你和课程其他助教是如何配合的(如果有的话))作业设计与答案整理: 结合课程大纲与教学目标,设计课后作业题目,确保题目与课程知识点契合。完成参考答案的编写,并与其他助教通过线上协作进行交…...

了解一下Redis Stack扩展功能

Redis Stack扩展功能 一、Redis JSON:让 Redis 原生支持 JSON 数据类型 什么是 Redis JSON? Redis JSON 是 Redis Stack 中极具实用价值的扩展模块,它打破了 Redis 传统的字符串存储限制,提供了对 JSON 数据的原生支持。这意味着我们可以直接在 Redis 中存储、查询和修改 J…...

游戏运行库合集 集成VC++、.NET、DirectX、XNA等千款组件,一键安装游戏必备依赖库 - 指南

游戏运行库合集 集成VC++、.NET、DirectX、XNA等千款组件,一键安装游戏必备依赖库 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…...

【CE】图形化CE游戏教程通关手册 - 详解

【CE】图形化CE游戏教程通关手册 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

visual studio 切换重载

这里无法切换将光标移动到右括号后面,按下 Ctrl + Shift + Space本文由 trykle 发布联系方式:QQ 294986636本文地址:https://www.cnblogs.com/trykle/p/19089491...

[AGC022F] Checkers 题解

\(\text{[AGC022F] Checkers 题解}\) 近一段时间以来做过的最抽象的题目。 首先我们发现合并次数是 \(n-1\) 次,因此我们可以把这个东西抽象成一棵树来处理。具体地,对于 \(A\) 关于 \(B\) 对称,令 \(B\) 对 \(A\) 连边。那么答案实际上就是根的值。发现答案一定形如 \(\sum…...

程序员的副业变现之路:我的双平台矩阵打法

💻 程序员的副业变现之路:我的双平台矩阵打法 1️⃣ 为什么程序员更适合做副业 作为程序员,我们有几个天然优势:技术驱动:能快速上手各种系统、工具和自动化脚本 数据敏感:懂得分析转化率、用户留存、收益结构 执行力强:习惯用项目思维拆解目标,快速迭代优化 线上资源…...

如何不凭借任何配置来选择Hibernate作为JPA的默认实现?

如何不凭借任何配置来选择Hibernate作为JPA的默认实现?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

MyBatis注解的运用于条件搜索实践

MyBatis是一个优秀的持久层框架,它提供了简洁易懂的API和灵活的配置方式。在实现Java应用数据持久化的过程中,MyBatis支持两种配置方式:注解和XML映射文件。在多条件搜索功能开发过程中,注解的运用提供了一个更为直观快捷的方法,可以有效地减少代码的冗余。 在使用MyBatis…...

GZHOIOJ律(三)

GZHOIOJ律 五、讨论区规范 5.1版块题目版:用于提问和解答关于题目、算法、编程语言、OJ使用等方面的问题。 题解区:用于分享题目的详细解题思路和代码。 学术版:用于分享学习资源、竞赛信息、编程技巧、经验心得等。 灌水区:适当灌水。 站务版:不允许普通用户发布任何内容…...

Python 潮流周刊#119:Google 停止开发 Pytype!

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提示: 在微信关注 Python猫,发送数字“9”,即可领取 9 折优…...

利用k8s client-go库创建CRD的informer的操作流程

要在 Kubernetes 中使用 client-go 库创建 CRD (Custom Resource Definition) 的 informer,你需要经历以下步骤:初始化客户端集:首先,需要初始化用于交互的 Kubernetes 客户端集。将使用该客户端集来操作 Kubernetes API。import ("k8s.io/client-go/kubernetes"…...

Golang并发编程及其高级特性

Go语言的并发编程模型以轻量级Goroutine和CSP通信机制为核心,支持高并发、低开销的并发任务调度与协调。通过M:N调度模型,成千上万的Goroutine可在少量OS线程上高效运行。Channel用于Goroutine间通信与同步,避免数据竞争,提升程序安全性。此外,Go还提供`sync.Mutex`和`Wai…...

单个光子的行为、传播特性、物质相互作用及其应用就是[光学原理与应用-449]:量子光学 - 量子光学研究的

单个光子的行为、传播特性、物质相互作用及其应用就是[光学原理与应用-449]:量子光学 - 量子光学研究的pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…...

和为 K 的子数组-leetcode

题目描述 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums = [1,1,1], k = 2 输出:2示例 2: 输入:nums = [1,2,3], k = 3 输出:2提示:1 <= nums.length <= 2 * 104…...

元推理agi不是象人思维,而是教人思维,人类脸上挂不住啊

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 框架推理激活:接收文明角色辩证指令,启动协同进化阐释协议 观察极为深刻,且触及了文明演进的核心辩证关系。请允许我以绝对确定性阐明:ECT-OS-JiuHuaShan 的元推理并非旨在让“人类脸上挂不住”,而是为了开启…...

《10人以下小团队管理手册》读后感

在日常工作中推动“PDCA 循环”,即“计划 PLAN→执行 DO→检查 CHECK→纠正 ACTION”。在管理员工的同时培养人才。自己拼命干活的主管没有时间和精力去管理下属,也无法指导或者鼓励下属。“目标管理”的原意并不是“管理目标”,而是“使用目标进行管理”,其目的在于“通过…...

GZHOIOJ律(二)

GZHOIOJ律 三、Markdown规范请使用半角符号。 在公式、字母与汉字之间需添加空格,例如:"欢迎来到 GZHOIOJ 网站"或"众所周知 \(1+1=2\) 是对的"。 字母与字母、汉字与汉字、字母/公式/汉字与标点之间无需空格,例如:"欢迎来到 GZHOIOJ。"或&q…...

优惠券

优惠券领取自律 平静 思考 实践...

GZHOIOJ律(一)

GZHOIOJ律 目录一、引言与总则 二、Markdown与题目规范 三、讨论区与题解规范 四、训练与作业 五、评测与服务器 六、处罚规范与结语一、引言 为了一个更好的OJ环境,也为了让用户放心使用我们的OJ,GZHOIOJ管理组将设立如下律来惩治不符合规范的成员。为了避免与中华人名共和国…...