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<Map> 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<String, Object> 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());
|
|
}
|
|
|
}
|