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("<table[^>]*>((?!table).)*</table>", "");
|
String repx = "<a[^>]+>([^<]+</a>)";//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 = "<a herf='eee'>1111</a>";
|
String repx = "<a[^>]+>([^<]+</a>)";
|
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);
|
}
|
}
|