- 博客(170)
- 收藏
- 关注
原创 @Override注解
通过在 `Dog` 类中的 `makeSound` 方法上使用 `@Override` 注解,我们明确表示这个 `makeSound` 方法是覆盖 `Animal` 类中的 `makeSound` 方法。- 如果父类的方法是 `static` 的,子类中覆盖的方法不能使用 `@Override` 注解,因为静态方法不能被覆盖,而是被隐藏。3. **避免错误**:如果不使用 `@Override`,可能会不小心覆盖了一个你并不打算覆盖的方法,或者忘记覆盖某个方法。
2025-06-01 14:51:16
304
原创 双检锁(Double-Checked Locking)单例模式
2. **双重检查**:在 `getInstance()` 方法中,首先检查 `objectMapper` 是否为 `null`,如果是,则进入同步块。1. **volatile 关键字**:确保 `objectMapper` 变量在多线程环境下的可见性,即一个线程对 `objectMapper` 的修改对其他线程立即可见。- **序列化**:确保 `ObjectMapper` 实例是线程安全的,因为 Jackson 的 `ObjectMapper` 是线程安全的,可以直接在多线程环境中使用。
2025-05-21 15:27:09
681
原创 `application-{env}.yml` 配置文件来实现多环境配置
Spring Boot 会自动加载 `application.yml` 或 `application.properties` 中的配置,并与激活的环境配置文件中的配置合并。这些文件通常命名为 `application-{env}.yml`,其中 `{env}` 是环境的名称,如 `dev`、`test`、`prod` 等。- **application.properties**:在 `application.properties` 文件中指定激活的配置文件。在每个配置文件中,你可以定义该环境特有的配置项。
2025-05-21 15:03:00
511
原创 RestController注解和Controller注解有什么区别?
**用途**:`@RestController` 是一个组合注解,它是 `@Controller` 和 `@ResponseBody` 的结合。- **用途**:`@Controller` 是一个通用的注解,用于标记一个类为 Spring MVC 的控制器。- **@Controller**:返回值通常是一个视图名称或 `ModelAndView` 对象,需要通过视图解析器来渲染视图。- **@Controller**:适用于传统的 Web 应用,需要渲染页面(如 HTML)。
2025-05-12 12:32:38
480
原创 spring常用注解
用途:标记一个类为 RESTful 控制器,用于处理 RESTful 请求并直接返回数据(而非视图)。用途:用于指定注入的 Bean 的名称,当存在多个相同类型的 Bean 时使用。用途:标记一个类为 Spring 的组件,使其被 Spring 容器管理。用途:标记一个类为配置类,用于定义 Spring 的 Bean 或配置。用途:标记一个类为数据访问层组件,通常用于 DAO(数据访问对象)。用途:标记一个类为控制器层组件,通常用于处理 HTTP 请求。用途:标记一个类为服务层组件,通常用于业务逻辑层。
2025-05-12 12:30:07
363
原创 Stream流
3. **并行支持**:Stream 提供了并行处理的能力,可以轻松地将单线程操作转换为多线程操作。2. **数据聚合**:使用 `sum`、`max`、`min`、`count` 等方法。1. **声明式**:Stream 提供了声明式的方式来处理数据,代码更加简洁易读。2. **链式调用**:Stream 的操作可以链式调用,形成一个操作流水线。1. **过滤和转换数据**:使用 `filter`、`map` 等方法。- `sum`、`max`、`min`、`count`:聚合操作。
2025-05-11 23:22:44
771
原创 app加固
我们之前讲的逆向,大多数都是用加密算法去加密一些明文字符串,然后把得到的结果用 Base64、Hex等进行编码后提交。加固其实也一样,只不过他通常加密的是 dex文件而已。但是 dex 文件加密以后,安卓系统是没法直接运行的。所以加固的核心,就是把 dex 文件加密,然后 app 运行过程中把 dex 文件解密,还原到内存中。一代 动态加载型 DexClassLoader 落地。二代 动态加载型。三代 代码抽取型。
2025-05-11 23:01:42
404
原创 Lambda表达式能用在哪些场景?
Lambda表达式是Java 8引入的一种强大特性,它允许以简洁的方式表示匿名函数(即没有名字的函数)。Lambda表达式可以用于许多场景,尤其是在与函数式接口、Stream API、并发编程等结合时,能够显著简化代码并提高开发效率。是 Java 8 引入的一个注解,用于标记一个接口为函数式接口。Lambda表达式可以与`CompletableFuture`、`ExecutorService`等并发工具结合使用,简化并发任务的编写。Lambda表达式可以用于事件处理,尤其是当事件处理器接口是函数式接口时。
2025-05-11 22:58:49
498
原创 Java 1.8(也称为Java 8)
Java 1.8(也称为Java 8)是Oracle于2014年发布的一个重要版本,引入了许多新特性和改进,极大地提升了Java语言的表达力和开发效率。Java 1.8对并发编程进行了显著增强,例如引入了`CompletableFuture`类。Stream API是Java 1.8引入的一种新的集合操作方式,允许开发者以声明式的方式处理集合数据。Java 1.8引入了全新的日期时间API,位于`java.time`包中。方法引用提供了更简洁的语法,可以直接引用已有的类或对象的方法。
2025-05-11 22:19:52
531
原创 ArrayList和LinkedList区别
在性能特点上,我需要提到 ArrayList 在随机访问时效率高,因为数组的索引访问是 O(1) 的,而 LinkedList 因为需要遍历节点,随机访问是 O(n) 的。关于内存占用,我需要指出 ArrayList 的内存使用相对规律,因为数组的存储是连续的,而 LinkedList 的节点存储是分散的,每个节点还需要额外的空间存储指针。这对于用户理解两者的内存特性很重要。最后是适用场景,比如 ArrayList 更适合频繁随机访问的场景,而 LinkedList 更适合频繁插入和删除的场景。
2025-05-09 10:14:54
355
原创 标签语句分析
如果 `tempTagNameSet` 为 `null`,则用一个空的 `HashSet` 替代,避免后续代码中出现 `NullPointerException`。- 创建一个 `Optional` 对象,如果 `tempTagNameSet` 为 `null`,则返回一个空的 `Optional`;- 如果 `Optional` 是空的(即 `tempTagNameSet` 为 `null`),则返回一个新的空 `HashSet`;如果 `tagsStr` 为空或 `null`,应该提供一个默认值。
2025-05-06 11:06:23
1014
原创 QueryWrapper
QueryWrapper` 是 MyBatis-Plus 提供的一个非常强大的查询构造器,用于构建 SQL 查询条件。它可以帮助你在不直接写 SQL 的情况下,灵活地构造各种复杂的查询条件。以下是一些常见的用法和示例,帮助你更好地理解和使用 `QueryWrapper`。假设你有一个 `User` 实体类,其中有一个 `tags` 字段,存储的是 JSON 格式的标签集合。如果你的数据库支持 JSON 查询(如 MySQL 5.7+),可以在数据库层面完成过滤,减少内存中的处理。
2025-05-06 10:30:48
779
原创 用户中心项目笔记1
这个类通常用作所有API响应的基类或模板。总之,`common` 层在项目中扮演着重要的角色,它通过提供统一的响应结构、集中管理错误码和简化业务代码,提高了代码的可读性、可维护性和开发效率。3. **简化业务代码**:业务代码中可以直接使用 `ResultUtils` 提供的快捷方法来构造响应,减少重复代码。4. **提高代码的可读性和可维护性**:将通用的响应结构、错误码和工具方法集中管理,使得代码更加整洁和易于维护。1. **统一的响应格式**:所有API响应都有统一的结构,方便客户端解析和处理。
2025-04-27 01:59:56
938
原创 ServiceImpl
Service 层是业务逻辑层,主要负责处理业务逻辑,是应用程序的核心部分。例如,如果未来需要更换业务逻辑的实现,只需要提供一个新的实现类,而不需要修改接口的使用者(Controller 层)。在软件开发中,尤其是采用分层架构(如常见的三层架构:Controller、Service、Repository)的项目中,“impl”通常是指“implementation(实现)”的缩写。总之,“ServiceImpl”是实现业务逻辑的具体类,它通过实现接口来提供具体的方法实现,是分层架构中非常重要的部分。
2025-04-27 01:36:18
640
原创 java代码审计-Servlet学习1
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,是运行在 Web 服务器或应用服务器上的程序。HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。1.当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径。3.实现接口中的抽象方法。
2024-12-06 23:34:59
321
原创 bugku-web-login2
审计一下:想要登录成功,可以 通过输入不存在用户,用union select 构造出指定密码的md5值这样。时,只有当所有条件都为真时,整个表达式的结果才为真。如果任何一个条件为假,整个表达式的结果就为假。随便输入个账号密码bp抓包,发现个小tip是base64加密的解密。1.php可以在网站子目录查看内容拿到flag。不知道为啥用bp始终登不上hackbar可以。通常用来检查一个变量是否为空或者没有内容。查看 flag文件并输出到1.php里边。
2024-12-01 22:24:02
287
原创 buuctf-reverse-Java逆向解密
异或(XOR)操作是一种位运算,它对两个数的对应位进行逐位比较。在二进制表示中,如果两个比较位相同,则结果为0;如果不同,则结果为1。逆推(kimi写的终于tm的让他写对次了)用idea打开Reverse.class。
2024-11-30 09:28:43
660
原创 buuctf-reverse-reverse2
`int __cdecl main(int argc, const char **argv, const char **envp)`:这是 `main` 函数的声明,它接受命令行参数和环境变量。- 如果 `pid` 非零(即父进程),调用 `waitpid(pid, &stat_loc, 0)` 等待子进程结束。- 如果 `pid` 为零(即子进程),执行循环,修改全局变量 `flag` 中的特定字符。- `__pid_t pid`:用于存储 `fork` 调用的结果,即子进程的 PID。
2024-11-30 00:40:13
476
原创 BUUCTF-reverse-reverse1
for循环是对str2做了一个转换的处理,str2里面ascii码为111的字符会被转换为ascii码为48的字符,在IDA中,选中数字按"R"键可以将数字转换为字符。strncmp(str1,str2,v3)是把str1与str2两字符串的前v3位数做一个比较,若str1=str2,返回0;一般来说,是先去找引用"flag"的代码段,然后一步步定位到关键部分,找到真正把flag加密的函数,然后手工逆向或者写解密脚本得到真正的flag。,简单的题目会有flag或者敏感数据字符等信息,方便我们定位。
2024-11-28 22:49:49
799
原创 攻防世界-mobile-eassy_app
当我们点击check按钮的时候,程序会调用check方法,参数即是我们的输入字符串,check方法的实现在native-lib.so库中。对其进行解包操作,获得该so库,IDA打开找到check。
2024-11-28 21:42:40
235
原创 攻防世界-mobile- 人民的名义-抓捕赵德汉1-200
可以看到用户输入就是:fa3733c647dca53a66cf8df953c2d539的md5解密。
2024-11-28 00:12:52
221
原创 攻防世界-mobile-APK逆向
在Android开发中,`classes.dex` 是一个非常重要的文件,它是应用程序的Dalvik Executable文件,包含了应用程序的编译代码。这两行代码通过 `findViewById` 方法获取布局中的 `EditText` 和 `Button` 控件,并分别赋值给 `edit_sn` 和 `btn_register`。如果输入的序列号与预期的序列号匹配,则验证成功。- 首先,调用 `checkSN` 方法检查 `edit_userName` 和 `edit_sn` 的值是否符合某种条件。
2024-11-27 00:26:46
940
原创 golang学习-切片
slice 并不是真正意义上的动态数组,而是一个引用类型。slice 总是指向一个底层 array,slice 的声明也可以像array 一样,只是不需要长度。slice 和数组的区别:声明数组时,[]内写明了数组的长度,而声明sice 时,[]内没有任何字符或使用...自动计算长度。切片在操作过程中,是直接操作原效组。因此,在go语言中,我们常常使用切片代合数组。切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案。切片作为函数参数时,传引用。
2024-11-24 23:02:27
389
原创 golang学习6-指针
栈帧存储:1.同部变量。(形参与局部变量存储地位等同)3.内存字段描述值。栈帧:用来给函数运行提供内存空间。取内存于 stack 上。传地址(引用):将形参的地址值作为函数参数、返回值后传递,等号 右边的变量,代表 变量内存空间存储的数据值。当函数调用时,产生栈帧。函数调用结束,释放栈帧。等号 左边的变量,代表 变量所指向的内存空间。传值(数据据):将实参的 值 拷贝一份给形参。指针变量就是存储地址的变量。传引用:在A栈帧内部,修改B栈帧中的变量值。*p:解引用、间接引用。
2024-11-24 21:57:19
650
原创 java代码审计3-FortifySCA 代码审计⼯具
它通过内置的五大主要分析引擎:数据流语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,通过与软件安全漏洞规则集进行匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并可导出报告。数据量引擎:跟踪、记录并分析程序中的数据传递过程所产生的安全问题语义引擎:分析过程中不安全的函数,方法的使用的安全问题。结构引擎:分析程序上下文环境、结构中的安全问题控制流引擎:分析程序特定时间、状态下执行操作指令的安全问题配置引擎:分析项目配置中的敏感信息和配置确实的安全问题。4、Fortify支持语言。
2024-11-23 09:51:09
547
原创 java代码审计2-文件上传漏洞
在上传获取后缀名 开发会对后缀名限制 例如 黑名单上传(禁止上传)java、jspx、jsp、php、exe、等文件类型。绕过上传后,服务器能解析改文件就能获取一个webshll。在上传时 有可控参数 会导致 目录穿越 上传类型不严时 通过上传恶意的war包到tomcat目录webapp目录中会获得webshell。代码中并没有后缀名进行限制 造成任意上传漏洞,直接上传jsp到指定目录。1.设置上传白名单 例如只允许上传 png gif jpg等图片类型后缀。3.上传目录 禁止解析脚本文件。
2024-11-23 09:32:59
647
原创 Python中常用的方法,函数
变量包含任何形式的空白字符,这些字符都会被去除,然后打印出处理后的字符串。方法返回一个新的字符串,它是原始字符串去掉前导和尾随空白后的结果。中的字符串,并去除字符串两端的空白字符(包括空格、换行符。是一个Python代码片段,用于打印变量。
2024-11-22 09:54:32
152
原创 golang学习4
1,切片与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大所以可以将切片理解成“动态数组”,但是,它不是数组。map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。长度是已经初始化的空间。容量是已经开辟的空间,包括已经初始化的空间和空闲的空间。map 是一种无序的键值对的集合。make(切片类型长度,容量)3,使用make()函数创建。切片名 := [类型]{}
2024-11-18 00:21:37
176
原创 ctf-攻防世界-mobile-基础adnroid
1、获取登录账号密码jadx-gui打开文件,可以看到MainActivity主入口有账号密码输入进入checkPassword函数编写python脚本解得第一层密码为:MainActivity2将编辑框的输入,广播发送出去 可以看到AndroidMenifest中广播接收者的定义在类中 接收到广播后只是启动了NextContent在apk中找到相应的文件,后缀名改成png打开,得到flag补充:`MainActivity2`类中的广播是指通过`sendBroadcast`方法发送的一个`Intent
2024-11-17 01:40:42
1306
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人