package com.terra.proxy.servlet;
|
|
import com.terra.proxy.bean.VistorBean;
|
import org.apache.commons.lang3.StringUtils;
|
import org.mitre.dsmiley.httpproxy.ProxyServlet;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
|
public class MyProxyServlet extends ProxyServlet {
|
|
private boolean flag;
|
|
private Logger log = LoggerFactory.getLogger(MyProxyServlet.class);
|
|
@Override
|
protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
|
|
flag = Boolean.parseBoolean(this.getConfigParam("flag"));
|
// VistorBean 操作日志入库信息
|
VistorBean vistorBean = new VistorBean();
|
// IP
|
vistorBean.setRequestip(servletRequest.getRemoteHost());
|
// URI
|
if (StringUtils.isNotEmpty(servletRequest.getRequestURI())) {
|
vistorBean.setServerurl(servletRequest.getRequestURI());
|
}
|
//
|
StringBuffer queryString2 = new StringBuffer();
|
//
|
StringBuffer uri = new StringBuffer();
|
// servlet.json 配置了 targetUri
|
if (StringUtils.isNotEmpty(getTargetUri(servletRequest))) {
|
uri.append(getTargetUri(servletRequest));
|
}
|
// pathInfo
|
if (StringUtils.isNotEmpty(servletRequest.getPathInfo())) {
|
uri.append(servletRequest.getPathInfo());
|
}
|
// queryString
|
String queryString = servletRequest.getQueryString();
|
if (StringUtils.isNotEmpty(queryString)) {
|
String[] params = queryString.split("&");
|
for (int i = 0; i < params.length; i++) {
|
queryString2 = queryString2.append("&").append(params[i]);
|
}
|
} else {
|
if (flag) {
|
vistorBean.setResult("Fail");
|
// 返回页面 500
|
return "http://" + "localhost" + ":" + servletRequest.getLocalPort() + "/500.html";
|
}
|
}
|
//
|
String fragment = null;
|
if (StringUtils.isNotEmpty(queryString)) {
|
int fragIdx = queryString.indexOf('#');
|
if (fragIdx >= 0) {
|
fragment = queryString.substring(fragIdx + 1);
|
}
|
}
|
if (StringUtils.isNotEmpty(queryString2)) {
|
uri.append('?').append(encodeUriQuery(queryString2));
|
}
|
if ((this.doSendUrlFragment) && (fragment != null)) {
|
uri.append('#').append(encodeUriQuery(fragment));
|
}
|
//
|
vistorBean.setResult("ok");
|
|
String url = uri.toString();
|
boolean result = checkHttpUrlConnection(getTargetUri());
|
if (!result) {
|
url = url.replace("71.3.251.28", "71.3.251.29");
|
}
|
log.info("*******************************");
|
log.info("FINAL HTTP URL : " + url);
|
log.info("*******************************");
|
|
return url;
|
}
|
|
private boolean checkHttpUrlConnection(String url) {
|
boolean result = false;
|
try {
|
URL testUrl = new URL(url);
|
HttpURLConnection connection = (HttpURLConnection) testUrl.openConnection();
|
connection.setRequestMethod(String.valueOf(RequestMethod.GET));
|
connection.setUseCaches(false);
|
connection.setConnectTimeout(3000);
|
connection.connect();
|
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
result = true;
|
}
|
connection.disconnect();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return result;
|
}
|
|
|
}
|