Ver código fonte

添加第三方业务代理访问逻辑

andyliu 7 meses atrás
pai
commit
1966d07fce

+ 17 - 17
src/main/java/com/shkpr/service/proxycenter/components/AbstractProxyServlet.java

@@ -5,7 +5,6 @@ import com.global.base.log.LogPrintMgr;
 import com.shkpr.service.proxycenter.commtools.CommTool;
 import com.shkpr.service.proxycenter.commtools.HttpTool;
 import com.shkpr.service.proxycenter.constants.ApiURI;
-import com.shkpr.service.proxycenter.constants.ProxyPassDefine;
 import com.shkpr.service.proxycenter.controllerfilter.TokenAuthenticationService;
 import com.shkpr.service.proxycenter.dto.ResponseCode;
 import org.apache.http.client.HttpClient;
@@ -29,12 +28,12 @@ import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 
 public abstract class AbstractProxyServlet extends ProxyServlet {
-    private String mStrClassName = "AbstractProxyServlet";
-    private String mStrBizType = "";
     private String proxyAddress = "https://127.0.0.1:9000/";
+    private String mStrClassName = "AbstractProxyServlet";
     private String proxyId = "";
     private String proxyTK = "";
     private String proxyUri = "";
+    protected String proxyBiz = "";
 
     public AbstractProxyServlet(String proxyUri, String proxyId, String proxyAddress, String proxyTK) {
         this.proxyUri = proxyUri;
@@ -46,6 +45,14 @@ public abstract class AbstractProxyServlet extends ProxyServlet {
     public AbstractProxyServlet() {
     }
 
+    protected String filterRealAddress(){
+        return proxyAddress;
+    }
+
+    protected String filterRealUri(){
+        return proxyUri;
+    }
+
     @Override
     protected HttpClient createHttpClient() {
         HttpClientBuilder clientBuilder = HttpClientBuilder.create().
@@ -84,6 +91,8 @@ public abstract class AbstractProxyServlet extends ProxyServlet {
         final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
         final String strIpAddress = HttpTool.getIpAddress(servletRequest);
         final String destUri = servletRequest.getRequestURI();
+
+        proxyBiz = servletRequest.getHeader(ApiURI.HEADER_PROXY_BIZ);
         ResponseCode headerCheck = checkHeader(servletRequest, servletResponse);
         if (headerCheck != ResponseCode.RESULT_NORMAL) {
             LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, proxyId, mStrClassName, "Outer"
@@ -97,7 +106,6 @@ public abstract class AbstractProxyServlet extends ProxyServlet {
             return;
         }
 
-
         servletRequest.setAttribute(ATTR_TARGET_URI, null);
 
         if (!destUri.startsWith(proxyUri)){
@@ -113,23 +121,15 @@ public abstract class AbstractProxyServlet extends ProxyServlet {
             return;
         }
 
-        switch (proxyId){
-            case ProxyPassDefine.PROXY_GEOSERVER:
-            case ProxyPassDefine.PROXY_ANALY:{
-                //nothing
-            }
-            break;
-            default: {
-                //若不重置super.targetUri;则super.targetUri实际地址为【/data-gw/3th/dma-proxy/*】中*号匹配的部分
-                //若重置super.targetUri=XXX; 则super.targetUri实际地址为XXX +【/data-gw/3th/dma-proxy/*】中*号匹配的部分
-                super.targetUri = proxyUri;
-            }
-            break;
+        if (!StringUtils.isEmpty(filterRealUri())){
+            //若不重置super.targetUri;则super.targetUri实际地址为【/data-gw/3th/dma-proxy/*】中*号匹配的部分
+            //若重置super.targetUri=XXX; 则super.targetUri实际地址为XXX +【/data-gw/3th/dma-proxy/*】中*号匹配的部分
+            super.targetUri = filterRealUri();
         }
 
         URI uri = null;
         try {
-            uri = new URI(proxyAddress);
+            uri = new URI(filterRealAddress());
         } catch (URISyntaxException e) {
             e.printStackTrace();
         }

+ 10 - 0
src/main/java/com/shkpr/service/proxycenter/components/AnalyASProxyServlet.java

@@ -8,6 +8,16 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 public class AnalyASProxyServlet extends AbstractProxyServlet {
+    @Override
+    protected String filterRealAddress() {
+        return super.filterRealAddress();
+    }
+
+    @Override
+    protected String filterRealUri() {
+        return "";
+    }
+
     public AnalyASProxyServlet(String proxyUri, String proxyId, String proxyAddress, String proxyTK) {
         super(proxyUri, proxyId, proxyAddress, proxyTK);
     }

+ 39 - 0
src/main/java/com/shkpr/service/proxycenter/components/Biz3thProxyServlet.java

@@ -0,0 +1,39 @@
+package com.shkpr.service.proxycenter.components;
+
+import com.shkpr.service.proxycenter.dto.ResponseCode;
+import com.shkpr.service.proxycenter.globalcache.GlobalData;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class Biz3thProxyServlet extends AbstractProxyServlet {
+    @Override
+    protected String filterRealAddress() {
+        String addressTo3th = GlobalData.getInstance().getBizToProxy3thAddress().get(proxyBiz);
+        if (StringUtils.isEmpty(addressTo3th))
+            return super.filterRealAddress();
+        return addressTo3th;
+    }
+
+    @Override
+    protected String filterRealUri() {
+        return "";
+    }
+
+    public Biz3thProxyServlet(String proxyUri, String proxyId, String proxyAddress, String proxyTK) {
+        super(proxyUri, proxyId, proxyAddress, proxyTK);
+    }
+
+    @Override
+    protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException {
+        super.service(servletRequest, servletResponse);
+    }
+
+    @Override
+    protected ResponseCode checkHeader(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
+        return super.checkHeader(servletRequest, servletResponse);
+    }
+}

+ 11 - 1
src/main/java/com/shkpr/service/proxycenter/components/GeoServerProxyServlet.java

@@ -17,6 +17,16 @@ import java.io.IOException;
 import java.util.Base64;
 
 public class GeoServerProxyServlet extends AbstractProxyServlet {
+    @Override
+    protected String filterRealAddress() {
+        return super.filterRealAddress();
+    }
+
+    @Override
+    protected String filterRealUri() {
+        return "";
+    }
+
     public GeoServerProxyServlet(String proxyUri, String proxyId, String proxyAddress, String proxyTK) {
         super(proxyUri, proxyId, proxyAddress, proxyTK);
     }
@@ -39,7 +49,7 @@ public class GeoServerProxyServlet extends AbstractProxyServlet {
         String strTime = servletRequest.getHeader(ApiURI.HEADER_TIMESTAMP);
         if (StringUtils.isEmpty(strSign) || StringUtils.isEmpty(strTime))
             return ResponseCode.RESULT_ERROR_SIGN;
-        
+
         long reqUTC = CastUtil.castUTCLong(strTime, 0L);
         if (!(TimeTool.isMsUTC(reqUTC) && Math.abs(System.currentTimeMillis()-reqUTC) <= 5*TimeTool.MS_ONE_MIN)){
             return ResponseCode.RESULT_REQUEST_TIMEOUT;

+ 44 - 0
src/main/java/com/shkpr/service/proxycenter/configuration/WebSecurityConfiguration.java

@@ -48,6 +48,10 @@ public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
     private Map<String, String> proxyToPassword = new HashMap<>();
     private Map<String, String> proxyToUri = new HashMap<>();
 
+    private Map<String, String> bizToProxy3thAddress = new HashMap<>();
+    private Map<String, String> bizToProxy3thAppId = new HashMap<>();
+    private Map<String, String> bizToProxy3thAppKey= new HashMap<>();
+
     public Map<String, String> getProxyToAddress() {
         return proxyToAddress;
     }
@@ -72,6 +76,30 @@ public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
         this.proxyToUri = proxyToUri;
     }
 
+    public Map<String, String> getBizToProxy3thAddress() {
+        return bizToProxy3thAddress;
+    }
+
+    public void setBizToProxy3thAddress(Map<String, String> bizToProxy3thAddress) {
+        this.bizToProxy3thAddress = bizToProxy3thAddress;
+    }
+
+    public Map<String, String> getBizToProxy3thAppId() {
+        return bizToProxy3thAppId;
+    }
+
+    public void setBizToProxy3thAppId(Map<String, String> bizToProxy3thAppId) {
+        this.bizToProxy3thAppId = bizToProxy3thAppId;
+    }
+
+    public Map<String, String> getBizToProxy3thAppKey() {
+        return bizToProxy3thAppKey;
+    }
+
+    public void setBizToProxy3thAppKey(Map<String, String> bizToProxy3thAppKey) {
+        this.bizToProxy3thAppKey = bizToProxy3thAppKey;
+    }
+
     @Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
         //使用自定义身份验证组件
@@ -240,10 +268,26 @@ public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
         return servletRegistrationBean;
     }
 
+    @Bean(name = ProxyPassDefine.PROXY_3TH)
+    public ServletRegistrationBean<Biz3thProxyServlet> servletServletRegistrationFor3thProxy() {
+        ServletRegistrationBean<Biz3thProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
+        servletRegistrationBean.setServlet(new Biz3thProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_3TH)
+                , ProxyPassDefine.PROXY_3TH
+                , proxyToAddress.get(ProxyPassDefine.PROXY_3TH)
+                , proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_3TH, RandomUtil.getRandomStr(8))));
+        servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_3TH), "*"));
+        servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
+        servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
+        return servletRegistrationBean;
+    }
+
     @PostConstruct
     public void init(){
         GlobalData.getInstance().initProxyToAddress(proxyToAddress);
         GlobalData.getInstance().initProxyToPassword(proxyToPassword);
         GlobalData.getInstance().initProxyToUri(proxyToUri);
+        GlobalData.getInstance().initBizToProxy3thAddress(bizToProxy3thAddress);
+        GlobalData.getInstance().initBizToProxy3thAppId(bizToProxy3thAppId);
+        GlobalData.getInstance().initBizToProxy3thAppKey(bizToProxy3thAppKey);
     }
 }

+ 1 - 0
src/main/java/com/shkpr/service/proxycenter/constants/ApiURI.java

@@ -3,6 +3,7 @@ public class ApiURI {
     public static final String HEADER_X_SOURCE_IP = "X-Source-IP";
     public static final String HEADER_BIZ_TYPE = "Biz-Type";
     public static final String HEADER_CLIENT_TYPE = "Client-Type";
+    public static final String HEADER_PROXY_BIZ = "Proxy-Biz";
     public static final String HEADER_USER_AGENT = "user-agent";
     public static final String HEADER_AUTH_VERIFY = "Auth-Verify";
     public static final String HEADER_SIGN_KEY = "tri_coorperation_tech_task";

+ 1 - 0
src/main/java/com/shkpr/service/proxycenter/constants/ProxyPassDefine.java

@@ -11,4 +11,5 @@ public interface ProxyPassDefine {
     String PROXY_STATS = "stats";
     String PROXY_PUSH = "push";
     String PROXY_GEOSERVER = "geoserver";
+    String PROXY_3TH = "proxy-3th";
 }

+ 34 - 0
src/main/java/com/shkpr/service/proxycenter/globalcache/GlobalData.java

@@ -28,6 +28,9 @@ public class GlobalData {
     private Map<String, String> proxyToAddress = new HashMap<>();
     private Map<String, String> proxyToPassword = new HashMap<>();
     private Map<String, String> proxyToUri = new HashMap<>();
+    private Map<String, String> bizToProxy3thAddress = new HashMap<>();
+    private Map<String, String> bizToProxy3thAppId = new HashMap<>();
+    private Map<String, String> bizToProxy3thAppKey= new HashMap<>();
 
     private long mTmUTCServiceOnline = 1580486400000L;        //服务上线的时间,默认为2020-02-01 00:00:00
     private String mStrInternalCallPassword = "";            //本机的内部通信可信任口令
@@ -173,4 +176,35 @@ public class GlobalData {
         if (CommTool.mapSize(proxyToUri) > 0)
             this.proxyToUri.putAll(proxyToUri);
     }
+
+    public Map<String, String> getBizToProxy3thAddress() {
+        return bizToProxy3thAddress;
+    }
+
+    public void initBizToProxy3thAddress(Map<String, String> bizToProxy3thAddress) {
+        this.bizToProxy3thAddress.clear();
+        if (CommTool.mapSize(bizToProxy3thAddress) > 0)
+            this.bizToProxy3thAddress.putAll(bizToProxy3thAddress);
+    }
+
+    public Map<String, String> getBizToProxy3thAppId() {
+        return bizToProxy3thAppId;
+    }
+
+    public void initBizToProxy3thAppId(Map<String, String> bizToProxy3thAppId) {
+        this.bizToProxy3thAppId.clear();
+        if (CommTool.mapSize(bizToProxy3thAppId) > 0)
+            this.bizToProxy3thAppId.putAll(bizToProxy3thAppId);
+    }
+
+    public Map<String, String> getBizToProxy3thAppKey() {
+        return bizToProxy3thAppKey;
+    }
+
+    public void initBizToProxy3thAppKey(Map<String, String> bizToProxy3thAppKey) {
+        this.bizToProxy3thAppKey.clear();
+        if (CommTool.mapSize(bizToProxy3thAppKey) > 0)
+            this.bizToProxy3thAppKey.putAll(bizToProxy3thAppKey);
+
+    }
 }

+ 9 - 0
src/main/resources/application.properties

@@ -91,6 +91,8 @@ atuocfg.proxyToUri[old-stats]=/stats
 atuocfg.proxyToUri[stats]=/v3/stats
 atuocfg.proxyToUri[push]=/push
 atuocfg.proxyToUri[geoserver]=/kpr/geo-power
+#第三方业务代理实际访问uri置于/kpr/proxy-3th之后,即:/kpr/proxy-3th/......
+atuocfg.proxyToUri[proxy-3th]=/kpr/proxy-3th
 
 #代理平台的目标地址
 atuocfg.proxyToAddress[base]=https://140.246.183.164:9000/
@@ -120,6 +122,13 @@ atuocfg.proxyToPassword[push]=Tri@Tech
 atuocfg.proxyToPassword[geoserver]=YWRtaW46a3ByLmdlb3NlcnZlckAyMzA3
 
 
+#第三方业务代理类型【xxx】放在请求header的【Proxy-Biz】字段中
+#第三方业务代理类型--》业务类型的实际访问地址
+atuocfg.bizToProxy3thAddress[xxx]=https://140.246.183.164:9000/
+#第三方业务代理类型--》应用ID
+atuocfg.bizToProxy3thAppId[xxx]=
+#第三方业务代理类型--》应用密钥
+atuocfg.bizToProxy3thAppKey[xxx]=