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<String, Object> getRequestParamAndHeader(){
|
|
try{
|
HttpServletRequest request = getRequest();
|
if(request == null){
|
return null;
|
}
|
|
//request信息
|
HashMap<String, Object> data = new HashMap<>();
|
HashMap<String, Object> requestParams = new HashMap<>();
|
Enumeration<String> paraNames = request.getParameterNames();
|
if(paraNames != null){
|
for(Enumeration<String> enumeration =paraNames;enumeration.hasMoreElements();){
|
String key= enumeration.nextElement();
|
requestParams.put(key, request.getParameter(key));
|
}
|
}
|
|
HashMap<String, Object> requestFilter = new HashMap<>();
|
Enumeration<String> attributeNames = request.getAttributeNames();
|
if(attributeNames != null){
|
for ( Enumeration<String> 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<String> headerNames = request.getHeaderNames();
|
HashMap<String, Object> headerParams = new HashMap<>();
|
if(headerNames != null){
|
for(Enumeration<String> 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<String> list = CarUtil.stringToArrayStrRegex(uri, "/");
|
list.removeIf(StringUtils::isNumeric); //去掉url中的数字参数
|
list.removeIf(c -> c.contains(","));// 去掉url中的逗号分隔参数
|
return StringUtils.join(list, "/");
|
}
|
}
|