package org.sxkj.common.utils;
|
|
import com.alibaba.cloud.commons.lang.StringUtils;
|
import org.hsqldb.lib.StringUtil;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
import org.sxkj.common.constant.CommonConstant;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.*;
|
|
/**
|
* HTTP 请求头工具类
|
*/
|
public class HeaderUtils {
|
|
|
/**
|
* 从当前请求中获取指定请求头(适用于Spring MVC环境)
|
*
|
* @param headerName 请求头名称(不区分大小写)
|
* @return 请求头值,不存在返回Optional.empty()
|
*/
|
public static Optional<String> getHeader(String headerName) {
|
return Optional.ofNullable(getServletRequest())
|
.flatMap(request -> getHeader(request, headerName));
|
}
|
|
/**
|
* 获取头信息中的城市code
|
*
|
* @return
|
*/
|
public static String getAreaCode() {
|
return getAreaCode(null);
|
|
}
|
|
/**
|
* * 获取城市code,没有传参按头信息中的
|
*
|
* @param areaCodeParam 待截取的行政区划
|
* @return 截取之后的行政区划code
|
*/
|
public static String getAreaCode(String areaCodeParam) {
|
return getAreaCodeHeaderAreaCode(areaCodeParam);
|
}
|
|
/**
|
* 格式化区域数据 360000 将后面的0000去掉
|
*
|
* @param areaCode 区域
|
* @return 后面无0 的数据
|
*/
|
public static String formatAreaCode(String areaCode) {
|
if (StringUtils.isEmpty(areaCode)) {
|
return areaCode;
|
}
|
areaCode = areaCode.replaceAll("0+$", "");
|
if (areaCode.length() % 2 == 1) {
|
return areaCode + "0";
|
}
|
return areaCode;
|
}
|
|
|
/**
|
* 获取行政区划,不删除长度
|
*
|
* @param areaCodeParam 行政区划 优先返回
|
* @return 行政区划
|
*/
|
public static String getAreaCodeHeaderAreaCode(String areaCodeParam) {
|
String areaCode = getHeader(CommonConstant.AREA_CODE).orElse(null);
|
String code = StringUtils.isEmpty(areaCodeParam) ? areaCode : areaCodeParam;
|
return formatAreaCode(code);
|
}
|
|
/**
|
* 获取行政区划,不处理长度
|
* @param areaCodeParam 行政区划 优先返回
|
* @return 行政区划code
|
*/
|
public static String getAreaCodeHeaderAreaCodeNot(String areaCodeParam) {
|
String areaCode = getHeader(CommonConstant.AREA_CODE).orElse(null);
|
return StringUtils.isEmpty(areaCodeParam) ? areaCode : areaCodeParam;
|
}
|
|
|
/**
|
* 从HttpServletRequest中获取指定请求头
|
*
|
* @param request HttpServletRequest对象
|
* @param headerName 请求头名称(不区分大小写)
|
* @return 请求头值,不存在返回Optional.empty()
|
*/
|
public static Optional<String> getHeader(HttpServletRequest request, String headerName) {
|
if (request == null || headerName == null || headerName.isEmpty()) {
|
return Optional.empty();
|
}
|
|
// 先尝试直接获取(性能更优)
|
String value = request.getHeader(headerName);
|
if (value != null) {
|
return Optional.of(value);
|
}
|
|
// 如果直接获取不到,再遍历所有header进行不区分大小写的匹配
|
Enumeration<String> headerNames = request.getHeaderNames();
|
while (headerNames != null && headerNames.hasMoreElements()) {
|
String name = headerNames.nextElement();
|
if (headerName.equalsIgnoreCase(name)) {
|
return Optional.ofNullable(request.getHeader(name));
|
}
|
}
|
|
return Optional.empty();
|
}
|
|
/**
|
* 从ServerHttpRequest中获取指定请求头(适用于WebFlux环境)
|
*
|
* @param request ServerHttpRequest对象
|
* @param headerName 请求头名称(不区分大小写)
|
* @return 请求头值,不存在返回Optional.empty()
|
*/
|
public static Optional<String> getHeader(ServerHttpRequest request, String headerName) {
|
if (request == null || headerName == null || headerName.isEmpty()) {
|
return Optional.empty();
|
}
|
|
HttpHeaders headers = request.getHeaders();
|
// 先尝试直接获取(性能更优)
|
if (headers.containsKey(headerName)) {
|
return Optional.ofNullable(headers.getFirst(headerName));
|
}
|
|
// 如果直接获取不到,再遍历所有header进行不区分大小写的匹配
|
for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
|
if (headerName.equalsIgnoreCase(entry.getKey())) {
|
return Optional.ofNullable(entry.getValue().get(0));
|
}
|
}
|
|
return Optional.empty();
|
}
|
|
/**
|
* 获取当前请求的所有请求头(适用于Spring MVC环境)
|
*
|
* @return 请求头Map,键已转为小写
|
*/
|
public static Map<String, String> getAllHeaders() {
|
return Optional.ofNullable(getServletRequest())
|
.map(HeaderUtils::getAllHeaders)
|
.orElse(Collections.emptyMap());
|
}
|
|
/**
|
* 从HttpServletRequest获取所有请求头
|
*
|
* @param request HttpServletRequest对象
|
* @return 请求头Map,键已转为小写
|
*/
|
public static Map<String, String> getAllHeaders(HttpServletRequest request) {
|
Map<String, String> headers = new HashMap<>();
|
if (request != null) {
|
Enumeration<String> headerNames = request.getHeaderNames();
|
while (headerNames != null && headerNames.hasMoreElements()) {
|
String name = headerNames.nextElement();
|
headers.put(name.toLowerCase(), request.getHeader(name));
|
}
|
}
|
return headers;
|
}
|
|
/**
|
* 从ServerHttpRequest获取所有请求头(适用于WebFlux环境)
|
*
|
* @param request ServerHttpRequest对象
|
* @return 请求头Map,键已转为小写
|
*/
|
public static Map<String, String> getAllHeaders(ServerHttpRequest request) {
|
Map<String, String> headers = new HashMap<>();
|
if (request != null) {
|
request.getHeaders().forEach((key, values) ->
|
headers.put(key.toLowerCase(), values.get(0)));
|
}
|
return headers;
|
}
|
|
/**
|
* 获取当前HttpServletRequest对象
|
*
|
* @return HttpServletRequest对象,可能为null
|
*/
|
private static HttpServletRequest getServletRequest() {
|
try {
|
ServletRequestAttributes attributes = (ServletRequestAttributes)
|
RequestContextHolder.getRequestAttributes();
|
return attributes != null ? attributes.getRequest() : null;
|
} catch (IllegalStateException e) {
|
// 非Web请求上下文
|
return null;
|
}
|
}
|
}
|