一、经典写法
java
@Autowired
HttpServletRequest request;
String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR"};
private String getClientIpClassic()
{
log.info("##### Classic");
for (String header : IP_HEADERS)
{
String ip = request.getHeader(header);
if (StringUtils.isNotBlank(ip) && !StringUtils.equalsIgnoreCase("unknown", ip))
{
log.info("##### ip header: {}", header);
String[] ips = ip.split(",");
return ips[0].trim();
}
}
log.info("##### request.getRemoteAddr");
return request.getRemoteAddr();
}
一、Lambda写法
java
private String getClientIpLambda()
{
log.info("##### Lambda");
return Arrays.stream(IP_HEADERS)
.peek(log::info)
.map(request::getHeader)
.filter(ips -> StringUtils.isNotBlank(ips) && !"unknown".equalsIgnoreCase(ips))
.flatMap(ips -> Arrays.stream(ips.split(",")))
.filter(StringUtils::isNotBlank)
.map(String::trim)
.findFirst()
.orElse(request.getRemoteAddr());
}