package com.zbkj.common.utils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Objects; /** * Request工具类 */ public class RequestUtil extends HttpServlet{ private static final String UNKNOWN = "unknown"; private static final String LOCALHOST_IP = "127.0.0.1"; // 客户端与服务器同为一台机器,获取的 ip 有时候是 ipv6 格式 private static final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1"; private static final String SEPARATOR = ","; // 根据 HttpServletRequest 获取 IP public static String getIpAddress(HttpServletRequest request) { if (request == null) { return "unknown"; } String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("X-Forwarded-For"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if (LOCALHOST_IP.equalsIgnoreCase(ip) || LOCALHOST_IPV6.equalsIgnoreCase(ip)) { // 根据网卡取本机配置的 IP InetAddress iNet = null; try { iNet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } if (iNet != null) { ip = iNet.getHostAddress(); } } } // 对于通过多个代理的情况,分割出第一个 IP if (ip != null && ip.length() > 15) { if (ip.indexOf(SEPARATOR) > 0) { ip = ip.substring(0, ip.indexOf(SEPARATOR)); } } return LOCALHOST_IPV6.equals(ip) ? LOCALHOST_IP : ip; } public static HttpServletRequest getRequest() { if(RequestContextHolder.getRequestAttributes() != null){ return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); } return null; } public static HashMap getRequestParamAndHeader(){ try{ HttpServletRequest request = getRequest(); if(request == null){ return null; } //request信息 HashMap data = new HashMap<>(); HashMap requestParams = new HashMap<>(); Enumeration paraNames = request.getParameterNames(); if(paraNames != null){ for(Enumeration enumeration =paraNames;enumeration.hasMoreElements();){ String key= enumeration.nextElement(); requestParams.put(key, request.getParameter(key)); } } HashMap requestFilter = new HashMap<>(); Enumeration attributeNames = request.getAttributeNames(); if(attributeNames != null){ for ( Enumeration attributeNames1 = attributeNames; attributeNames1.hasMoreElements();) { String key= attributeNames1.nextElement(); if(key.contains("request_")){ requestFilter.put(key, request.getAttribute(key)); } } } data.put("url", request.getRequestURL()); data.put("uri", request.getRequestURI()); data.put("method", request.getMethod()); data.put("request", requestParams); data.put("request_filter", requestFilter); //header 信息 Enumeration headerNames = request.getHeaderNames(); HashMap headerParams = new HashMap<>(); if(headerNames != null){ for(Enumeration enumeration = headerNames;enumeration.hasMoreElements();){ String key= enumeration.nextElement(); String value=request.getHeader(key); headerParams.put(key, value); } } data.put("header", headerParams); return data; }catch (Exception e){ e.printStackTrace(); return null; } } public static String getDomain(){ HttpServletRequest request = getRequest(); if(request == null){ return null; } return request.getServerName() + ":" + request.getServerPort(); } public static String getUri(HttpServletRequest request){ String uri = request.getRequestURI(); List list = CarUtil.stringToArrayStrRegex(uri, "/"); list.removeIf(StringUtils::isNumeric); //去掉url中的数字参数 list.removeIf(c -> c.contains(","));// 去掉url中的逗号分隔参数 return StringUtils.join(list, "/"); } }