获取请求的真实ip地址


import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

public class GetInet4Address {

    public static String getInet4Address() {
        Enumeration<NetworkInterface> nis;
        String ip = null;
        try {
            nis = NetworkInterface.getNetworkInterfaces();
            for (; nis.hasMoreElements();) {
                NetworkInterface ni = nis.nextElement();
                Enumeration<InetAddress> ias = ni.getInetAddresses();
                for (; ias.hasMoreElements();) {
                    InetAddress ia = ias.nextElement();
                    //ia instanceof Inet6Address && !ia.equals("")
                    if (ia instanceof Inet4Address && !ia.getHostAddress().equals("127.0.0.1")) {
                        ip = ia.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return ip;
    }
    public static InetAddress getCurrentIp() {
        try {
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) networkInterfaces.nextElement();
                Enumeration<InetAddress> nias = ni.getInetAddresses();
                while (nias.hasMoreElements()) {
                    InetAddress ia = (InetAddress) nias.nextElement();
                    if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
                        return ia;
                    }
                }
            }
        } catch (SocketException e) {
            System.out.println(e.getStackTrace());
        }
        return null;
    }

    public static void main(String[] args) {
        System.out.println(GetInet4Address.getCurrentIp()); /// 
        System.out.println( GetInet4Address.getInet4Address()); 
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值