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).)*", ""); 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); } }