Spring中获取HttpServletRequest的三种方式小结
更新时间:2026年04月14日 09:29:59 作者:爱码少年 00fly.online
spring框架web环境中,获取HttpServletRequest是常见的操作,本文将为大家详细介绍一下Spring中获取HttpServletRequest的三种方式,有需要的小伙伴可以了解下
一、简要概述
spring框架web环境中,获取HttpServletRequest是常见的操作,下面我们以获取客户端ip功能为例,给出获取HttpServletRequest对象的几种方式。
二、3种方式
1、直接在请求方法参数中声明
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"};
@GetMapping({"/", "/index"})
public String index(HttpServletRequest request)
{
return StringUtils.join("client ip: ", getClientIp(request));
}
/**
* 获取客户端真实IP地址
*/
private String getClientIp(HttpServletRequest request)
{
for (String header : IP_HEADERS)
{
String ip = request.getHeader(header);
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
{
String[] ips = ip.split(",");
log.info("##### ip header: {}", header);
return ips[0].trim();
}
}
log.info("##### request.getRemoteAddr");
return request.getRemoteAddr();
}
2、注入方式获取
@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"};
@GetMapping({"/", "/index"})
public String index()
{
return StringUtils.join("client ip: ", getClientIp(request));
}
/**
* 获取客户端真实IP地址
*/
private String getClientIp(HttpServletRequest request)
{
for (String header : IP_HEADERS)
{
String ip = request.getHeader(header);
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
{
// 处理多个IP的情况(逗号分隔)
String[] ips = ip.split(",");
log.info("##### ip header: {}", header);
return ips[0].trim();
}
}
log.info("##### request.getRemoteAddr");
return request.getRemoteAddr();
}
或者
@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"};
@GetMapping({"/", "/index"})
public String index()
{
return StringUtils.join("client ip: ", getClientIp());
}
/**
* 获取客户端真实IP地址
*/
private String getClientIp()
{
for (String header : IP_HEADERS)
{
String ip = request.getHeader(header);
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
{
// 处理多个IP的情况(逗号分隔)
String[] ips = ip.split(",");
log.info("##### ip header: {}", header);
return ips[0].trim();
}
}
log.info("##### request.getRemoteAddr");
return request.getRemoteAddr();
}
3、隐式从上下文获取
@GetMapping({"/", "/index"})
public String index()
{
return StringUtils.join("client ip: ", getClientIp());
}
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"};
/**
* 获取客户端真实IP地址
*/
private String getClientIp()
{
HttpServletRequest request = getHttpServletRequest();
for (String header : IP_HEADERS)
{
String ip = request.getHeader(header);
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
{
// 处理多个IP的情况(逗号分隔)
String[] ips = ip.split(",");
log.info("##### ip header: {}", header);
return ips[0].trim();
}
}
log.info("##### request.getRemoteAddr");
return request.getRemoteAddr();
}
private HttpServletRequest getHttpServletRequest()
{
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
if (servletRequestAttributes != null)
{
return servletRequestAttributes.getRequest();
}
return null;
}
大家可以根据需要选择其中一种使用。
到此这篇关于Spring中获取HttpServletRequest的三种方式小结的文章就介绍到这了,更多相关Spring获取HttpServletRequest内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot整合log4j日志与HashMap的底层原理解析
这篇文章主要介绍了SpringBoot整合log4j日志与HashMap的底层原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01
SpringCloud无法获取Nacos中的配置文件信息解决方案
文章介绍了在项目启动时解决@Value占位符值找不到问题的步骤,包括检查版本号、添加依赖、检查配置文件优先级以及正确配置dataID2025-12-12
Springboot使用RestTemplate调用第三方接口的操作代码
这篇文章主要介绍了Springboot使用RestTemplate调用第三方接口,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,感兴趣的朋友可以参考RestTemplate源码2022-12-12
Spark SerializedLambda错误的两种解决方案
这篇文章主要介绍了Spark SerializedLambda错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11


最新评论