|
@@ -0,0 +1,367 @@
|
|
|
+package com.onemap.spatial.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.onemap.common.core.utils.DateUtils;
|
|
|
+import com.onemap.common.core.utils.StringUtils;
|
|
|
+import com.onemap.common.core.utils.ip.IpUtils;
|
|
|
+import com.onemap.spatial.domain.TYztZyml;
|
|
|
+import com.onemap.spatial.domain.TZymlApplicationRecordVo;
|
|
|
+import com.onemap.spatial.mapper.TZymlApplicationRecordMapper;
|
|
|
+import com.onemap.spatial.mapper.TYztZymlMapper;
|
|
|
+import com.onemap.spatial.service.IProxyHandleService;
|
|
|
+import com.onemap.spatial.service.cache.LocalCache;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.servlet.ServletOutputStream;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.*;
|
|
|
+import java.net.HttpURLConnection;
|
|
|
+import java.net.URL;
|
|
|
+import java.net.URLConnection;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class ProxyHandleServiceImpl implements IProxyHandleService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private TZymlApplicationRecordMapper tZymlApplicationRecordMapper;
|
|
|
+ @Resource
|
|
|
+ private TYztZymlMapper TYztZymlMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String proxyServerCheck(String token, HttpServletRequest request, HttpServletResponse response) throws IOException {
|
|
|
+ String fu_id = null;
|
|
|
+ boolean isCheck = false;
|
|
|
+ String token_cache = "PROXYKEY" + "_" + token;
|
|
|
+ Object objectData = LocalCache.getInstance().getValue(token_cache);
|
|
|
+ TZymlApplicationRecordVo dto = null;
|
|
|
+ if (objectData == null) {
|
|
|
+ QueryWrapper<TZymlApplicationRecordVo> wrapper = new QueryWrapper<TZymlApplicationRecordVo>();
|
|
|
+ wrapper.eq("fw_key", token);
|
|
|
+ wrapper.eq("state", 3);
|
|
|
+ dto = tZymlApplicationRecordMapper.selectOne(wrapper);
|
|
|
+ if (null == dto || StringUtils.isNull(dto)) {
|
|
|
+ return fu_id;
|
|
|
+ }
|
|
|
+ LocalCache.getInstance().putValue(token_cache, dto, 1);
|
|
|
+ } else {
|
|
|
+ if (objectData instanceof TZymlApplicationRecordVo) {
|
|
|
+ dto = (TZymlApplicationRecordVo) objectData;
|
|
|
+ } else {
|
|
|
+ return fu_id;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ long difftime = DateUtils.getDateDiff(dto.getDeadline(), new Date());
|
|
|
+ if (difftime < 0) {
|
|
|
+ return fu_id;
|
|
|
+ }
|
|
|
+
|
|
|
+ String callIp = dto.getCallIp();
|
|
|
+ String[] callIps = callIp.split(",");
|
|
|
+ String ipAddr = IpUtils.getIpAddr(request);
|
|
|
+ for (String ip : callIps) {
|
|
|
+ if (ipAddr.equals(ip) && !"unknown".equals(ipAddr) && !"127.0.0.1".equals(ipAddr) && !"localhost".equals(ipAddr)) {
|
|
|
+ isCheck = true;
|
|
|
+ fu_id = dto.getZymlId();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!isCheck) {
|
|
|
+ return fu_id;
|
|
|
+ }
|
|
|
+ return fu_id;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public TYztZyml proxyServerData(String fwid) throws IOException {
|
|
|
+ Object objectData = LocalCache.getInstance().getValue(fwid);
|
|
|
+ if (null == objectData) {
|
|
|
+ cacheServerData(fwid);
|
|
|
+ objectData = LocalCache.getInstance().getValue(fwid);
|
|
|
+ }
|
|
|
+ if (objectData instanceof TYztZyml) {
|
|
|
+ return (TYztZyml) objectData;
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public synchronized void cacheServerData(String fwid) throws IOException {
|
|
|
+ Object objectData = LocalCache.getInstance().getValue(fwid);
|
|
|
+ if (null == objectData) {
|
|
|
+ TYztZyml bsmData = TYztZymlMapper.selectTYztZymlByBsm(fwid);
|
|
|
+ if (null == bsmData) {
|
|
|
+ LocalCache.getInstance().putValue(fwid, "-1", 6);
|
|
|
+ } else {
|
|
|
+ LocalCache.getInstance().putValue(fwid, bsmData, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void proxyGeoServer(TYztZyml serverData, HttpServletRequest request, HttpServletResponse response) {
|
|
|
+ //请求地址
|
|
|
+ String url = geURL(request);
|
|
|
+ ////System.out.println("url:" + url);
|
|
|
+
|
|
|
+ int len = url.indexOf("siweigeoserver");
|
|
|
+ String paramsurl = url.substring(len + 14);
|
|
|
+ String serverUrl = serverData.getUrl();
|
|
|
+
|
|
|
+ //判断ows
|
|
|
+ int owsLen = paramsurl.indexOf("/ows");
|
|
|
+ String qqurl = "";
|
|
|
+ if (owsLen == 0) {
|
|
|
+ int wmslen = serverUrl.indexOf("geoserver");
|
|
|
+ qqurl = serverUrl.substring(0, wmslen + 9) + paramsurl;
|
|
|
+ } else {
|
|
|
+ qqurl = serverUrl + paramsurl;
|
|
|
+ }
|
|
|
+ ////System.out.println("wz:" + url);
|
|
|
+ ////System.out.println("len:" + len);
|
|
|
+ ////System.out.println("paramsurl:" + paramsurl);
|
|
|
+ ////System.out.println("serverUrl:" + serverUrl);
|
|
|
+ ////System.out.println("qqurl:" + qqurl);
|
|
|
+
|
|
|
+ Map params = new HashMap();
|
|
|
+ Enumeration<String> parameters = request.getParameterNames();
|
|
|
+ while (parameters.hasMoreElements()) {
|
|
|
+ String paramName = parameters.nextElement();
|
|
|
+ String paramValue = request.getParameter(paramName);
|
|
|
+// 处理参数
|
|
|
+// ////System.out.println("paramName:"+paramName);
|
|
|
+// ////System.out.println("paramValue:"+paramValue);
|
|
|
+ params.put(paramName, paramValue);
|
|
|
+ }
|
|
|
+ String url_new = qqurl;
|
|
|
+ formaServerResponse(url_new, params, response);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void proxySuperMapServer(TYztZyml serverData, HttpServletRequest request, HttpServletResponse response) {
|
|
|
+ //请求地址
|
|
|
+ String url = geURL(request);
|
|
|
+ System.out.println("url:" + url);
|
|
|
+
|
|
|
+ int len = url.indexOf("siweisupermap");
|
|
|
+ String siweiUrl = url.substring(0, len + 13);
|
|
|
+ String paramsurl = url.substring(len + 13);
|
|
|
+ String serverUrl = serverData.getUrl();
|
|
|
+ //判断output ,修改查询信息
|
|
|
+ int outputLen = paramsurl.indexOf("/output");
|
|
|
+ String qqurl = "";
|
|
|
+ if (outputLen == 0) {
|
|
|
+ int wmslen = serverUrl.indexOf("iserver");
|
|
|
+ qqurl = serverUrl.substring(0, wmslen + 7) + paramsurl;
|
|
|
+ } else {
|
|
|
+ qqurl = serverUrl + paramsurl;
|
|
|
+ }
|
|
|
+ Map params = new HashMap();
|
|
|
+ Enumeration<String> parameters = request.getParameterNames();
|
|
|
+ while (parameters.hasMoreElements()) {
|
|
|
+ String paramName = parameters.nextElement();
|
|
|
+ String paramValue = request.getParameter(paramName);
|
|
|
+ params.put(paramName, paramValue);
|
|
|
+ }
|
|
|
+ String url_new = qqurl;
|
|
|
+// 判断legend.json,替换查询参数
|
|
|
+ int owsLen = paramsurl.indexOf("/legend.json");
|
|
|
+ if (owsLen == 0) {
|
|
|
+ int olen = serverUrl.lastIndexOf("iserver");
|
|
|
+ String oldData = serverUrl.substring(0, olen + 7);
|
|
|
+ String newData = siweiUrl;
|
|
|
+ formaServerJsonReplace(url_new, params, response, oldData, newData);
|
|
|
+ } else {
|
|
|
+ formaServerResponse(url_new, params, response);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取URL信息,?之前的
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String geURL(HttpServletRequest request) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ // 获取协议
|
|
|
+ String protocol = request.isSecure() ? "https://" : "http://";
|
|
|
+ sb.append(protocol);
|
|
|
+ // 获取请求的主机名
|
|
|
+ sb.append(request.getServerName());
|
|
|
+ // 获取端口号(如果为默认端口则不添加)
|
|
|
+ int port = request.getServerPort();
|
|
|
+ if ((port != 80 && !request.isSecure()) || (port != 443 && request.isSecure())) {
|
|
|
+ sb.append(":").append(port);
|
|
|
+ }
|
|
|
+ // 获取上下文路径
|
|
|
+ sb.append(request.getContextPath());
|
|
|
+ // 获取请求URI
|
|
|
+ sb.append(request.getRequestURI());
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取URL信息
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getCompleteURL(HttpServletRequest request) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ // 获取协议
|
|
|
+ String protocol = request.isSecure() ? "https://" : "http://";
|
|
|
+ sb.append(protocol);
|
|
|
+ // 获取请求的主机名
|
|
|
+ sb.append(request.getServerName());
|
|
|
+ // 获取端口号(如果为默认端口则不添加)
|
|
|
+ int port = request.getServerPort();
|
|
|
+ if ((port != 80 && !request.isSecure()) || (port != 443 && request.isSecure())) {
|
|
|
+ sb.append(":").append(port);
|
|
|
+ }
|
|
|
+ // 获取上下文路径
|
|
|
+ sb.append(request.getContextPath());
|
|
|
+ // 获取请求URI
|
|
|
+ sb.append(request.getRequestURI());
|
|
|
+ // 获取查询字符串(如果存在)
|
|
|
+ if (request.getQueryString() != null) {
|
|
|
+ sb.append("?").append(request.getQueryString());
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送server请求,并将数据返回
|
|
|
+ *
|
|
|
+ * @param uri
|
|
|
+ * @param params
|
|
|
+ * @param response
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ private void formaServerResponse(String uri, Map params, HttpServletResponse response) {
|
|
|
+ try {
|
|
|
+ uri = uriJoinParam(uri, params);
|
|
|
+ System.out.println("uri:" + uri);
|
|
|
+ URL url = new URL(uri);
|
|
|
+ HttpURLConnection con = (HttpURLConnection) url.openConnection();
|
|
|
+ if (con.getResponseCode() == 400) {
|
|
|
+ response.setStatus(400);
|
|
|
+ } else if (con.getResponseCode() == 404) {
|
|
|
+ response.setStatus(404);
|
|
|
+ } else {
|
|
|
+ InputStream headimgIs = con.getInputStream();
|
|
|
+
|
|
|
+ // 获取所有响应头字段
|
|
|
+ Map<String, List<String>> headers = con.getHeaderFields();
|
|
|
+ for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
|
|
|
+ List<String> d_values = entry.getValue();
|
|
|
+ String d_key = entry.getKey();
|
|
|
+ if (StringUtils.isNotEmpty(d_key) && d_values != null && d_values.size() >= 1) {
|
|
|
+ response.setHeader(entry.getKey(), d_values.get(0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ response.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ ServletOutputStream outputStream = response.getOutputStream();
|
|
|
+ int len = 0;
|
|
|
+ byte[] bytes = new byte[1024];
|
|
|
+ while ((len = headimgIs.read(bytes)) > 0) {
|
|
|
+ outputStream.write(bytes, 0, len);
|
|
|
+ }
|
|
|
+ headimgIs.close();
|
|
|
+ outputStream.close();
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println("获取文件流出错," + e);
|
|
|
+ response.setStatus(500);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送server请求,并将数据返回,处理JSON会将参数进行替换
|
|
|
+ *
|
|
|
+ * @param uri
|
|
|
+ * @param params
|
|
|
+ * @param response
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ private void formaServerJsonReplace(String uri, Map params, HttpServletResponse response, String oldData, String newData) {
|
|
|
+ try {
|
|
|
+ uri = uriJoinParam(uri, params);
|
|
|
+ URL url = new URL(uri);
|
|
|
+ HttpURLConnection con = (HttpURLConnection) url.openConnection();
|
|
|
+ if (con.getResponseCode() == 400) {
|
|
|
+ response.setStatus(400);
|
|
|
+ } else if (con.getResponseCode() == 404) {
|
|
|
+ response.setStatus(404);
|
|
|
+ } else {
|
|
|
+ String result = "";
|
|
|
+ InputStream headimgIs = con.getInputStream();
|
|
|
+ // 获取所有响应头字段
|
|
|
+ Map<String, List<String>> headers = con.getHeaderFields();
|
|
|
+ for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
|
|
|
+ List<String> d_values = entry.getValue();
|
|
|
+ String d_key = entry.getKey();
|
|
|
+ if (StringUtils.isNotEmpty(d_key) && d_values != null && d_values.size() >= 1) {
|
|
|
+ response.setHeader(entry.getKey(), d_values.get(0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ InputStreamReader is = new InputStreamReader(headimgIs, "utf-8");
|
|
|
+ BufferedReader bufferedReader = new BufferedReader(is);
|
|
|
+ StringBuffer strBuffer = new StringBuffer();
|
|
|
+ String line = null;
|
|
|
+ while (null != (line = bufferedReader.readLine())) {
|
|
|
+ strBuffer.append(line);
|
|
|
+ }
|
|
|
+ is.close();
|
|
|
+ con.disconnect();
|
|
|
+ result = strBuffer.toString();
|
|
|
+// System.out.println("result:" + result);
|
|
|
+ response.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ ServletOutputStream outputStream = response.getOutputStream();
|
|
|
+ String newStringData = result.replaceAll(oldData, newData);
|
|
|
+ outputStream.write(newStringData.getBytes("UTF-8"));
|
|
|
+ outputStream.close();
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println("获取文件流出错," + e);
|
|
|
+ response.setStatus(500);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * get请求方式针对uri的参数封装
|
|
|
+ *
|
|
|
+ * @param uri
|
|
|
+ * @param params
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String uriJoinParam(String uri, Map params) {
|
|
|
+ StringBuilder sbf = new StringBuilder(uri);
|
|
|
+ if (uri.indexOf("?") > 0) {
|
|
|
+ sbf.append("&");
|
|
|
+ } else {
|
|
|
+ sbf.append("?");
|
|
|
+ }
|
|
|
+ for (Object key : params.keySet()) {
|
|
|
+ Object value = params.get(key);
|
|
|
+ if (value instanceof String) {
|
|
|
+ String valueStr = (String) value;
|
|
|
+ sbf.append(key).append("=").append(URLEncoder.encode(valueStr)).append("&");
|
|
|
+ } else {
|
|
|
+ sbf.append(key).append("=").append(value).append("&");
|
|
|
+ }
|
|
|
+// sbf.append(key).append("=").append(params.get(key)).append("&");
|
|
|
+ }
|
|
|
+ return sbf.toString();
|
|
|
+ }
|
|
|
+}
|