From 32bfbaf60b57c6b9c8b6b03d171afc4d5927a71c Mon Sep 17 00:00:00 2001 From: "zzs01@yunemao.com" Date: Fri, 20 Sep 2024 19:04:23 +0800 Subject: [PATCH] feat:add proxy api --- .../config/SecurityConfiguration.java | 2 + ensign-server/pom.xml | 77 ----------------- .../server/controller/DefaultController.java | 68 --------------- .../server/controller/ProxyController.java | 74 ++++++++++++++++ .../server/exception/AllKingdeeException.java | 13 +++ .../ensign/crm/server/utils/ProxyUtils.java | 85 +++++++++++++++++++ .../ensign/crm/server/utils/RequestConf.java | 22 +++++ .../src/main/resources/application.yaml | 2 +- 8 files changed, 197 insertions(+), 146 deletions(-) delete mode 100644 ensign-server/src/main/java/com/ensign/crm/server/controller/DefaultController.java create mode 100644 ensign-server/src/main/java/com/ensign/crm/server/controller/ProxyController.java create mode 100644 ensign-server/src/main/java/com/ensign/crm/server/exception/AllKingdeeException.java create mode 100644 ensign-server/src/main/java/com/ensign/crm/server/utils/ProxyUtils.java create mode 100644 ensign-server/src/main/java/com/ensign/crm/server/utils/RequestConf.java diff --git a/ensign-module-infra/ensign-module-infra-biz/src/main/java/com/ensign/crm/module/infra/framework/security/config/SecurityConfiguration.java b/ensign-module-infra/ensign-module-infra-biz/src/main/java/com/ensign/crm/module/infra/framework/security/config/SecurityConfiguration.java index cb64177..a402b9e 100644 --- a/ensign-module-infra/ensign-module-infra-biz/src/main/java/com/ensign/crm/module/infra/framework/security/config/SecurityConfiguration.java +++ b/ensign-module-infra/ensign-module-infra-biz/src/main/java/com/ensign/crm/module/infra/framework/security/config/SecurityConfiguration.java @@ -37,6 +37,8 @@ public class SecurityConfiguration { .antMatchers(adminSeverContextPath + "/**").anonymous(); // 文件读取 registry.antMatchers(buildAdminApi("/infra/file/*/get/**")).permitAll(); + + registry.antMatchers("/crm/**").permitAll(); } }; diff --git a/ensign-server/pom.xml b/ensign-server/pom.xml index 0d0c422..1d35351 100644 --- a/ensign-server/pom.xml +++ b/ensign-server/pom.xml @@ -31,83 +31,6 @@ ensign-module-infra-biz ${revision} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - org.springframework.boot diff --git a/ensign-server/src/main/java/com/ensign/crm/server/controller/DefaultController.java b/ensign-server/src/main/java/com/ensign/crm/server/controller/DefaultController.java deleted file mode 100644 index b560713..0000000 --- a/ensign-server/src/main/java/com/ensign/crm/server/controller/DefaultController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.ensign.crm.server.controller; - -import com.ensign.crm.framework.common.pojo.CommonResult; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import static com.ensign.crm.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED; - -/** - * 默认 Controller,解决部分 module 未开启时的 404 提示。 - * 例如说,/bpm/** 路径,工作流 - * - * @author 芋道源码 - */ -@RestController -public class DefaultController { - - @RequestMapping("/admin-api/bpm/**") - public CommonResult bpm404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[工作流模块 ensign-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]"); - } - - @RequestMapping("/admin-api/mp/**") - public CommonResult mp404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[微信公众号 ensign-module-mp - 已禁用][参考 https://doc.iocoder.cn/mp/build/ 开启]"); - } - - @RequestMapping(value = {"/admin-api/product/**", // 商品中心 - "/admin-api/trade/**", // 交易中心 - "/admin-api/promotion/**"}) // 营销中心 - public CommonResult mall404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[商城系统 ensign-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); - } - - @RequestMapping("/admin-api/erp/**") - public CommonResult erp404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[ERP 模块 ensign-module-erp - 已禁用][参考 https://doc.iocoder.cn/erp/build/ 开启]"); - } - - @RequestMapping("/admin-api/crm/**") - public CommonResult crm404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[CRM 模块 ensign-module-crm - 已禁用][参考 https://doc.iocoder.cn/crm/build/ 开启]"); - } - - @RequestMapping(value = {"/admin-api/report/**"}) - public CommonResult report404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[报表模块 ensign-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]"); - } - - @RequestMapping(value = {"/admin-api/pay/**"}) - public CommonResult pay404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[支付模块 ensign-module-pay - 已禁用][参考 https://doc.iocoder.cn/pay/build/ 开启]"); - } - - @RequestMapping(value = {"/admin-api/ai/**"}) - public CommonResult ai404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[AI 大模型 ensign-module-ai - 已禁用][参考 https://doc.iocoder.cn/ai/build/ 开启]"); - } - -} diff --git a/ensign-server/src/main/java/com/ensign/crm/server/controller/ProxyController.java b/ensign-server/src/main/java/com/ensign/crm/server/controller/ProxyController.java new file mode 100644 index 0000000..2c498f0 --- /dev/null +++ b/ensign-server/src/main/java/com/ensign/crm/server/controller/ProxyController.java @@ -0,0 +1,74 @@ +package com.ensign.crm.server.controller; + +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpRequest; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +/** + * @Description: TODO + * @Date: 2024/9/20 18:28 + * @Created: by ZZSLL + */ + + +@RestController +@RequestMapping("/ensign/crm") +public class ProxyController { + + private String targetAddr = "http://10.64.112.152:8022"; + + + @RequestMapping(value = "/proxy/**", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public void proxy(HttpServletRequest request, HttpServletResponse response) throws IOException, URISyntaxException { + URI uri = new URI(request.getRequestURI()); + String path = uri.getPath(); + String query = request.getQueryString(); + String target = targetAddr + path.replace("/ensign/crm/proxy", ""); + if (query != null && !query.isEmpty() && !query.equals("null")) { + target = target + "?" + query; + } + URI newUri = new URI(target); + // 执行代理查询 + String methodName = request.getMethod(); + HttpMethod httpMethod = HttpMethod.resolve(methodName); + if (httpMethod == null) { + return; + } + ClientHttpRequest delegate = new SimpleClientHttpRequestFactory().createRequest(newUri, httpMethod); + Enumeration headerNames = request.getHeaderNames(); + // 设置请求头 + while (headerNames.hasMoreElements()) { + String headerName = headerNames.nextElement(); + Enumeration v = request.getHeaders(headerName); + List arr = new ArrayList<>(); + while (v.hasMoreElements()) { + arr.add(v.nextElement()); + } + delegate.getHeaders().addAll(headerName, arr); + } + StreamUtils.copy(request.getInputStream(), delegate.getBody()); + // 执行远程调用 + ClientHttpResponse clientHttpResponse = delegate.execute(); + response.setStatus(clientHttpResponse.getStatusCode().value()); + // 设置响应头 + clientHttpResponse.getHeaders().forEach((key, value) -> value.forEach(it -> { + response.setHeader(key, it); + })); + StreamUtils.copy(clientHttpResponse.getBody(), response.getOutputStream()); + } + +} diff --git a/ensign-server/src/main/java/com/ensign/crm/server/exception/AllKingdeeException.java b/ensign-server/src/main/java/com/ensign/crm/server/exception/AllKingdeeException.java new file mode 100644 index 0000000..b7b3547 --- /dev/null +++ b/ensign-server/src/main/java/com/ensign/crm/server/exception/AllKingdeeException.java @@ -0,0 +1,13 @@ +package com.ensign.crm.server.exception; + +/** + * @Description: TODO + * @Date: 2024/9/20 18:33 + * @Created: by ZZSLL + */ + +public class AllKingdeeException extends Exception { + public AllKingdeeException(String message) { + super(message); + } +} diff --git a/ensign-server/src/main/java/com/ensign/crm/server/utils/ProxyUtils.java b/ensign-server/src/main/java/com/ensign/crm/server/utils/ProxyUtils.java new file mode 100644 index 0000000..486a23d --- /dev/null +++ b/ensign-server/src/main/java/com/ensign/crm/server/utils/ProxyUtils.java @@ -0,0 +1,85 @@ +package com.ensign.crm.server.utils; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.ensign.crm.server.exception.AllKingdeeException; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: TODO + * @Date: 2024/9/20 18:33 + * @Created: by ZZSLL + */ + + +@Slf4j +public class ProxyUtils { + + public void initAppToken() throws IOException, AllKingdeeException + { + + final String END_POINT = "/ierp/api/getAppToken.do"; + + HttpClient client = new DefaultHttpClient(); + + HttpPost post = new HttpPost(END_POINT); + + Map body = new HashMap<>(); + + body.put("appId", ""); + body.put("appSecuret", ""); + body.put("tenantid", ""); + body.put("accountId", ""); + body.put("language", ""); + + HttpEntity reqEntity = new StringEntity(JSONUtil.toJsonStr(body), "utf-8"); + + post.setEntity(reqEntity); + post.setConfig(RequestConf.initRequestConfig()); + HttpResponse response = client.execute(post); + + if (response.getStatusLine().getStatusCode() == 200) { + + HttpEntity resEntity = response.getEntity(); + String responseData = EntityUtils.toString(resEntity, "utf-8"); + + JSONObject jsonObject = JSONUtil.parseObj(responseData); + + Boolean status = (Boolean) jsonObject.get("status"); + + String state = (String) jsonObject.get("state"); + + if (status && "success".equals(state)) { + + JSONObject data = (JSONObject) jsonObject.get("data"); + + String appToken = (String) data.get("app_token"); + + if (appToken != null && !appToken.isEmpty()) { + + Long expireTime = (Long) data.get("expire_time"); + + + return; + } + } + + log.error("获取appToken失败 {}", jsonObject); + throw new AllKingdeeException("获取appToken失败"); + } + + log.error("获取appToken失败 {}", EntityUtils.toString(response.getEntity(), "utf-8")); + throw new AllKingdeeException("获取appToken失败"); + } +} diff --git a/ensign-server/src/main/java/com/ensign/crm/server/utils/RequestConf.java b/ensign-server/src/main/java/com/ensign/crm/server/utils/RequestConf.java new file mode 100644 index 0000000..aaa53af --- /dev/null +++ b/ensign-server/src/main/java/com/ensign/crm/server/utils/RequestConf.java @@ -0,0 +1,22 @@ +package com.ensign.crm.server.utils; + +import org.apache.http.client.config.RequestConfig; +import org.springframework.stereotype.Component; + +/** + * @Description: TODO + * @Date: 2024/9/20 18:32 + * @Created: by ZZSLL + */ + +@Component +public class RequestConf +{ + public static RequestConfig initRequestConfig() { + return RequestConfig.custom() + .setConnectTimeout(5000)//一、连接超时:connectionTimeout-->指的是连接一个url的连接等待时间 + .setSocketTimeout(5000)// 二、读取数据超时:SocketTimeout-->指的是连接上一个url,获取response的返回等待时间 + .setConnectionRequestTimeout(5000) + .build(); + } +} diff --git a/ensign-server/src/main/resources/application.yaml b/ensign-server/src/main/resources/application.yaml index 288c6e8..f6ee5b9 100644 --- a/ensign-server/src/main/resources/application.yaml +++ b/ensign-server/src/main/resources/application.yaml @@ -108,7 +108,6 @@ aj: cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选 - water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode interference-options: 0 # 滑动干扰项(0/1/2) req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定 @@ -197,6 +196,7 @@ ensign: - /admin-api/pay/notify/** # 支付回调通知,不携带租户编号 - /jmreport/* # 积木报表,无法携带租户编号 - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号 + - /admin-api/crm/** ignore-tables: - system_tenant - system_tenant_package