SpringBoot获取请求的IP地址

SpringBoot获取请求的IP地址: 

注意:

x-forwarded-forX-Forwarded-For区分大小写问题:有时候是小写有时候是大写,在于nginx.conf中的proxy_set_header如何配置了

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IpUtil {
    private static final String UNKNOWN = "unknown";
    private static final String LOCALHOST = "127.0.0.1";
    private static final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1";//客户端与服务器同为一台机器获取的ip有时候是ipv6格式表示的本地地址

    private static final String SEPARATOR = ",";

    public static String getIpAddr(HttpServletRequest request) {
        System.out.println(request);
        String ipAddress;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            //ipAddress = request.getHeader("X-Forwarded-For");//有时候是大写,在于nginx.conf中的proxy_set_header如何配置了
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("X-Real-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (LOCALHOST.equals(ipAddress)||LOCALHOST_IPV6.equals(ipAddress)) {
                    InetAddress inet = null;
                    try {
                        // 根据网卡取本机配置的IP
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            // "***.***.***.***".length()
            if (ipAddress != null && ipAddress.length() > 15) {
                if (ipAddress.indexOf(SEPARATOR) > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress = "";
        }
        return ipAddress;
    }
}

 

对原文有新增内容:https://www.jianshu.com/p/3871a2c47c09

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Spring Boot 中获取请求的 IP 地址可以使用 HttpServletRequest 对象。可以在控制器的方法参数中加入 HttpServletRequest 对象,然后调用其 getRemoteAddr() 方法来获取客户端的 IP 地址。 例如: ``` @Controller public class MyController { @RequestMapping("/getIp") public void getIp(HttpServletRequest request) { String ip = request.getRemoteAddr(); System.out.println("IP : " + ip); } } ``` 如果网络中使用了代理服务器或负载均衡器,那么可以使用HttpServletRequest的getHeader("X-Forwarded-For") 来获取真实的IP. ``` String ipAddress = request.getHeader("X-FORWARDED-FOR"); if (ipAddress == null) { ipAddress = request.getRemoteAddr(); } ``` ### 回答2: 在Spring Boot中获取请求IP地址可以通过HttpServletRequest对象中的getRemoteAddr()方法来实现。 首先,在控制器方法的参数中添加HttpServletRequest对象,如下所示: ``` @RequestMapping("/test") public String test(HttpServletRequest request) { String ip = request.getRemoteAddr(); // 其他处理逻辑 } ``` 然后使用getRemoteAddr()方法获取请求IP地址。getRemoteAddr()方法返回的是一个字符串,表示客户端的IP地址。 需要注意的是,使用getRemoteAddr()方法获取的是客户端发起请求IP地址,但是如果请求经过了代理服务器等中间服务器的转发,getRemoteAddr()方法可能会返回代理服务器的IP地址而不是真实的客户端IP地址。如果需要获取真实的客户端IP地址,可以考虑使用一些其他方式,比如获取请求头中的X-Forwarded-For字段。 示例代码如下: ``` @RequestMapping("/test") public String test(HttpServletRequest request) { 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("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } // 其他处理逻辑 } ``` 以上代码通过逐个判断请求头中的字段获取IP地址,如果都没有获取到,则返回getRemoteAddr()方法获取IP地址。请注意,在使用代理服务器等中间服务器转发请求时,不同的代理服务器可能会使用不同的字段来传递客户端IP地址,因此需要根据实际情况选择合适的字段来获取IP地址。 ### 回答3: 在Spring Boot中获取请求IP地址可以通过获取HttpServletRequest对象来实现。在控制器方法或者拦截器中,可以将HttpServletRequest对象作为参数传入,然后调用其getRemoteAddr()方法来获取请求IP地址。 示例代码如下: ```java import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController public class MyController { @RequestMapping("/getIp") public String getIp(HttpServletRequest request) { String ip = request.getRemoteAddr(); return ip; } } ``` 在上面的示例中,我们定义了一个RESTful风格的控制器类MyController,其中有一个映射路径为"/getIp"的请求处理方法getIp。该方法的参数是HttpServletRequest对象request,通过调用request.getRemoteAddr()方法获取请求IP地址,并返回给客户端。 Spring Boot中的请求对象HttpServletRequest封装了客户端的请求信息,其中包含了请求IP地址请求方法、请求参数等相关信息。通过在方法中声明HttpServletRequest对象作为参数,Spring Boot会自动将当前请求的HttpServletRequest对象传递给该方法。 需要注意的是,由于存在CDN、代理服务器等的转发,HttpServletRequest对象的getRemoteAddr()方法获取IP地址可能不准确。如果需要获取真实的客户端IP地址,可以考虑从请求头中获取X-Forwarded-For或者Proxy-Client-IP等字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值