package com.terra.proxy.servlet;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.terra.proxy.bean.ResActionRecord;
import com.terra.proxy.bean.VistorBean;
import com.terra.proxy.service.Impl.ServerRegisterServiceImpl;
import com.terra.proxy.util.JedisUtils;
import com.terra.proxy.util.Result;
import org.apache.http.*;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.entity.BasicHttpEntity;
import org.mitre.dsmiley.httpproxy.ProxyServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import redis.clients.jedis.Jedis;
import javax.annotation.PostConstruct;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URI;
import java.net.URLEncoder;
import java.sql.Timestamp;
import java.util.Date;
import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public abstract class GisProxyServlet extends ProxyServlet {
private Logger log = LoggerFactory.getLogger(RerequestServlet.class);
@Autowired
JedisUtils jedisUtils;
protected Result result;
ServerRegisterServiceImpl service;
@PostConstruct
public void init() {
try {
super.init();
} catch (ServletException e) {
e.printStackTrace();
}
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
service = wac.getBean(ServerRegisterServiceImpl.class);
}
public static boolean isdigit(String str) {
return str.matches("[0-9]+");
}
public abstract String rewriteUrlFromRequest(HttpServletRequest servletRequest);
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[1-9]\\d*|0$");
return pattern.matcher(str).matches();
}
protected void copyResponseEntity(HttpResponse proxyResponse, HttpServletResponse servletResponse)
throws IOException {
HttpEntity entity = proxyResponse.getEntity();
BufferedReader reader;
InputStream is = entity.getContent();
if (result != null && !result.get("code").equals(0)) {
servletResponse.setStatus((int) result.get("code"));
}
ServletOutputStream outputStream = servletResponse.getOutputStream();
Boolean imageFlag = false;
Boolean htmlFlag = false;
HeaderElement[] elements = entity.getContentType().getElements();
for (HeaderElement element : elements) {
if (element.getName().contains("image")) {
imageFlag = true;
}
}
if (!imageFlag && isgzip(entity)) {
reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
StringBuffer sb = new StringBuffer();
String s = null;
while ((s = reader.readLine()) != null) {
sb.append(s);
}
String result = sb.toString();
result = result.replaceAll("
", "");
String repx = "]+>([^<]+)";//a标签过滤
result = result.replaceAll(repx, "");
result = result.replaceAll("(http|https)://[^/]+/", "/");
result = result.replaceAll("/arcgis/rest/services", "");
BasicHttpEntity entity2 = new BasicHttpEntity();
byte[] bt;
bt = compress(result);
ByteArrayInputStream btinput = new ByteArrayInputStream(bt);
entity2.setContent(btinput);
entity2.setContentEncoding("gzip");
entity2.setContentType(entity.getContentType());
entity2.setChunked(false);
//entity2.setContentType("image/png");
if (entity2 != null) {
servletResponse.addHeader("Content-Length", String.valueOf(bt.length));
OutputStream servletOutputStream = servletResponse.getOutputStream();
entity2.writeTo(servletOutputStream);
}
} else {
if (entity != null) {
OutputStream servletOutputStream = servletResponse.getOutputStream();
entity.writeTo(servletOutputStream);
}
}
}
/*
* 统计不同ip调用服务次数,并将其存入入redis
*/
protected void visitlogsaveinredis(VistorBean vb) {
String fromip = vb.getRequestip();
vb.setDate(new Date());
Jedis jedis = null;
int count = 0;
try {
jedis = JedisUtils.getJedis();
jedis.sadd("visitlog", JSONObject.toJSONStringWithDateFormat(vb, "yyyy-MM-dd HH:mm:ss", SerializerFeature.PrettyFormat));
} catch (Exception e) {
log.error("redis包错");
} finally {
jedis.close();
}
}
/*
* 统计不同ip调用服务次数,并将其存入入redis
*/
protected void saveResActionRecord(ResActionRecord vb) {
vb.setActiontime(new Timestamp(new Date().getTime()));
Jedis jedis = null;
int count = 0;
try {
jedis = JedisUtils.getJedis();
jedis.sadd("TerraResActionRecord", JSONObject.toJSONStringWithDateFormat(vb, "yyyy-MM-dd HH:mm:ss", SerializerFeature.PrettyFormat));
} catch (Exception e) {
log.error("redis包错");
} finally {
jedis.close();
}
}
public static byte[] compress(String str) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = null;
try {
gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (gzip != null) {
try {
gzip.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return out.toByteArray();
}
public boolean isgzip(HttpEntity entity) {
return entity.getContentEncoding() != null
&& "Content-Encoding: gzip".equals(entity.getContentEncoding().toString()) ? true : false;
}
public boolean ishtml(HttpEntity entity) {
String temp = entity.getContentType().toString();
return temp.contains("text/html") ? true : false;
}
protected void setXForwardedForHeader(HttpServletRequest servletRequest, HttpRequest proxyRequest) {
String headerName = "X-Forwarded-For";
if (this.doForwardIP) {
String newHeader = servletRequest.getRemoteAddr();
String existingHeader = servletRequest.getHeader(headerName);
if (existingHeader != null) {
newHeader = existingHeader + ", " + newHeader;
}
proxyRequest.setHeader(headerName, newHeader);
}
}
protected void copyResponseHeaders(HttpResponse proxyResponse, HttpServletRequest servletRequest,
HttpServletResponse servletResponse) {
for (Header header : proxyResponse.getAllHeaders()) {
if (!hopByHopHeaders.containsHeader(header.getName())) {
if ((header.getName().equalsIgnoreCase("Set-Cookie"))
|| (header.getName().equalsIgnoreCase("Set-Cookie2"))) {
copyProxyCookie(servletRequest, servletResponse, header);
} else {
servletResponse.addHeader(header.getName(), header.getValue());
System.out.print(header.getName() + header.getValue());
}
}
}
System.out.print(servletResponse.containsHeader("Content-Length"));
}
protected String saveActionResult(HttpServletRequest servletRequest, VistorBean vb, URI errorurl, String sucessflag) {
servletRequest.setAttribute(ATTR_TARGET_HOST, URIUtils.extractHost(errorurl));
vb.setResult(sucessflag);
visitlogsaveinredis(vb);
if (result != null && !result.get("code").equals(0)) {
URI str = URI.create("http://" + "localhost" + ":" + servletRequest.getLocalPort() + "/log/error?result=" + URLEncoder.encode(JSONObject.toJSONString(result)));
return str.toString();
} else {
return "http://" + "localhost" + ":" + servletRequest.getLocalPort() + "/404.html";
}
}
public static void main(String[] args) {
String str = "1111";
String repx = "]+>([^<]+)";
String s = str.replaceAll(repx, "");
System.out.println("s = " + s);
String result = "http://18.1.1.231:8088/2222/cas/login.js";
result = result.replaceAll("(http|https)://[^/]*\\.js$", "/");
System.out.println("result = " + result);
System.out.println("result = " + result);
}
}