package com.terra.proxy.servlet; import com.terra.proxy.bean.VistorBean; import com.terra.proxy.controller.ZiyuanRightManager; import org.apache.commons.lang3.StringUtils; import org.apache.http.client.utils.URIUtils; import javax.servlet.http.HttpServletRequest; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class RerequestServlet extends GisProxyServlet { @Override public String rewriteUrlFromRequest(HttpServletRequest servletRequest) { URI errorurl = URI.create("http://" + "localhost" + ":" + servletRequest.getServerPort() + "/404.html"); StringBuilder uri = new StringBuilder(1000); StringBuilder queryString2 = new StringBuilder(1000); System.out.print(servletRequest.getHeader("Content-Length") + servletRequest.getHeader("Transfer-Encoding")); if (servletRequest.getPathInfo() != null) {// ex: /my/path.html System.out.println(servletRequest.getPathInfo()); uri.append(encodeUriQuery(servletRequest.getPathInfo())); } // Handle the query string & fragment String queryString = servletRequest.getQueryString();// ex:(following //阻止请求为JSON的代理服务 Boolean jsonFlag = false; if (jsonFlag) { servletRequest.setAttribute(ATTR_TARGET_HOST, URIUtils.extractHost(errorurl)); return "http://" + "localhost" + ":" + servletRequest.getServerPort() + "/404.html"; } // '?'): String fragment = null; // 根据zyid和suffix后缀查询对应的真实服务地址,判断是否公开, 公开不需要token拼接参数返回 List serverlist = new ArrayList<>(); String zyid = ""; String path = servletRequest.getPathInfo(); String[] splitpath = path.split("/"); zyid = splitpath[1]; String suffix = null; if (splitpath.length > 3 && splitpath[3] != null) { suffix = isdigit(splitpath[2]) ? splitpath[2] : null; } Map param = new HashMap(); if (!isInteger(zyid)) { servletRequest.setAttribute(ATTR_TARGET_HOST, URIUtils.extractHost(errorurl)); return "http://" + "localhost" + ":" + servletRequest.getServerPort() + "/404.html"; } param.put("resourceid", Integer.valueOf(zyid)); param.put("suffix", suffix != null ? Integer.valueOf(suffix) : null); param.put("enable", 1); param.put("fromsys", "HYJGPT"); serverlist = service.queryServer(param); param.put("SERVERURL", serverlist.get(0).get("SERVERURL").toString()); serverlist.add(param); System.out.print(serverlist.toString()); String url = serverlist.get(0).get("SERVERURL").toString(); String substringAfter = StringUtils.substringAfter(url, "?"); //代理地址是否包含layers 字段 int layers = url.indexOf("layers"); int server = path.indexOf("Server"); String originalParam = ""; int paraIndex = url.indexOf("?"); if (server != -1) { if (paraIndex != -1) { originalParam = StringUtils.split(url, "?")[1]; url = StringUtils.split(url, "?")[0]; } url = url + StringUtils.substringAfter(path, "Server"); } Integer ispublic = Integer.valueOf(serverlist.get(0).get("ISPUBLIC").toString()); URI hostpath = URI.create(url); servletRequest.setAttribute(ATTR_TARGET_HOST, URIUtils.extractHost(hostpath)); VistorBean vb = new VistorBean(); vb.setRequestip(servletRequest.getRemoteAddr()); vb.setResourceid(Integer.valueOf(zyid)); vb.setVisitfromsys("HYJGPT"); vb.setServerurl(serverlist.get(0).get("SERVERURL").toString()); if (queryString != null) { // 针对请求地址的参数做操作 // 判断是否带了token if (queryString.indexOf("token") == -1 && ispublic != 1) { saveActionResult(servletRequest, vb, errorurl, "fail"); } String par[] = queryString.split("&"); for (int i = 0; i < par.length; i++) { String a = par[i].split("=")[0]; if ("token".equals(a)) { String v = par[i].split("=")[1]; //这里使用lantool的token,把子资源id也申请token result = ZiyuanRightManager.checkRight(v, servletRequest.getHeader("referer"), servletRequest.getRemoteAddr(), zyid, ispublic.toString(), servletRequest.getPathInfo()); // 判断内存里有咩有匹配的token,咩有去redis库里查询,库里没有,则在内存和库中存储,库里有,存入内存 if (!result.get("code").equals(0)) { return saveActionResult(servletRequest, vb, errorurl, "fail"); } } else { boolean layers1 = par[i].contains("layers"); if (layers1 && layers != -1) { //除去多余字段 continue; } int index = queryString2.indexOf("="); if (index > -1) { queryString2.append("&").append(par[i]); } else { queryString2.append(par[i]); } } } int fragIdx = queryString.indexOf('#'); if (fragIdx >= 0) { fragment = queryString.substring(fragIdx + 1); queryString = queryString.substring(0, fragIdx); } } else { if (ispublic != 1) { return saveActionResult(servletRequest, vb, errorurl, "fail"); } } if (!serverlist.isEmpty()) { System.out.print(serverlist.get(0).get("SERVERURL").toString()); StringBuilder returnuri = new StringBuilder(url); if (queryString2 != null && queryString2.length() > 0) { if (!(returnuri.indexOf("?") > -1)) { returnuri.append('?'); } returnuri.append(encodeUriQuery(queryString2)); } if (doSendUrlFragment && fragment != null) { returnuri.append('#'); returnuri.append(encodeUriQuery(fragment)); } vb.setResult("success"); visitlogsaveinredis(vb); String resultStr = returnuri.toString(); if (resultStr.contains("?")) { resultStr += "&" + originalParam; } else { resultStr += "?" + originalParam; } return resultStr; } return null; } public static void main(String[] args) { String string = "where=1%3D1&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=&returnGeometry=true&maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&returnTrueCurves=false&resultOffset=&resultRecordCount=&f=JSON"; StringBuilder stringBuilder = new StringBuilder(); String[] split = string.split("&"); for (String str : split) { String[] strings = str.split("="); if (!(strings.length == 1)) { stringBuilder.append(strings[0]); stringBuilder.append("="); stringBuilder.append(strings[1]); stringBuilder.append("&"); } } System.out.println(stringBuilder.toString()); } }