package com.terra.proxy.servlet; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URI; import java.util.Date; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.terra.proxy.bean.VistorBean; import com.terra.proxy.proxy.SolrProxyServletConfiguration; import com.terra.proxy.util.HttpContextUtils; import com.terra.proxy.util.JedisUtils; import cn.hutool.json.JSONArray; import cn.hutool.json.XML; import redis.clients.jedis.Jedis; public class ZjProxyServlet extends ProxyServlet { private String layer; private boolean flag; private Logger log = LoggerFactory.getLogger(ZjProxyServlet.class); protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) { // 获取来源ip,统计调用次数 flag = Boolean.parseBoolean(this.getConfigParam("flag")); VistorBean vb = new VistorBean(); vb.setRequestip(servletRequest.getRemoteHost()); if (servletRequest.getRequestURI() != null) { vb.setServerurl(servletRequest.getRequestURI()); } URI errorurl = URI.create("http://" + "localhost" + ":" + servletRequest.getServerPort() + "/404.html"); StringBuilder queryString2 = new StringBuilder(1000); StringBuilder uri = new StringBuilder(500); if (getTargetUri(servletRequest) != null) { uri.append(getTargetUri(servletRequest)); } if (servletRequest.getPathInfo() != null) { uri.append(encodeUriQuery(servletRequest.getPathInfo())); } String queryString = servletRequest.getQueryString(); if (queryString != null) { // 针对请求地址的参数做操作 // 判断是否带了token if (flag && queryString.indexOf("token") == -1) { servletRequest.setAttribute(ATTR_TARGET_HOST, URIUtils.extractHost(errorurl)); vb.setResult("fail"); visitlogsaveinredis(vb); return "http://" + "localhost" + ":" + servletRequest.getLocalPort() + "/500.html"; } String par[] = queryString.split("&"); for (int i = 0; i < par.length; i++) { String a = par[i].split("=")[0]; String v = par[i].split("=").length >= 2 ? par[i].split("=")[1] : ""; if (a.equals("layers") && v.contains("mpt")) { layer = v.replace(".", " "); } if ("token".equals(a)) { // 判断内存里有咩有匹配的token,咩有去redis库里查询,库里没有,则在内存和库中存储,库里有,存入内存 if (flag) { if (!SolrProxyServletConfiguration.tokens.contains(v)) { Jedis jedis = null; try { jedis = JedisUtils.getJedis(); if (!jedis.exists(v)) { servletRequest.setAttribute(ATTR_TARGET_HOST, URIUtils.extractHost(errorurl)); vb.setResult("fail"); visitlogsaveinredis(vb); return "http://" + "localhost" + ":" + servletRequest.getLocalPort() + "/tokenerror.html"; } } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); } } } } else { queryString2.append("&").append(par[i]); } } } else { if (flag) { vb.setResult("fail"); visitlogsaveinredis(vb); return "http://" + "localhost" + ":" + servletRequest.getLocalPort() + "/500.html"; } } String fragment = null; if (queryString != null) { int fragIdx = queryString.indexOf('#'); if (fragIdx >= 0) { fragment = queryString.substring(fragIdx + 1); queryString = queryString.substring(0, fragIdx); } } if ((queryString2 != null) && (queryString2.length() > 0)) { uri.append('?'); uri.append(encodeUriQuery(queryString2)); } if ((this.doSendUrlFragment) && (fragment != null)) { uri.append('#'); uri.append(encodeUriQuery(fragment)); } vb.setResult("ok"); visitlogsaveinredis(vb); System.out.println(uri.toString()); return uri.toString(); } /** * 统计不同ip调用服务次数,并将其存入入redis */ private void visitlogsaveinredis(VistorBean vb) { String fromip = vb.getRequestip(); vb.setDate(new Date()); vb.setVisitfromsys("ZJZT"); Jedis jedis = null; 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(); } } protected void copyResponseEntity(HttpResponse proxyResponse, HttpServletResponse servletResponse) throws IOException { HttpEntity entity = proxyResponse.getEntity(); BufferedReader reader; InputStream is = entity.getContent(); Boolean imageFlag = false; Boolean htmlFlag = false; Header contentType = entity.getContentType(); if (null != contentType) { HeaderElement[] elements = contentType.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("