Java如何獲取發(fā)送請(qǐng)求的電腦的IP地址
介紹
客戶端所有的請(qǐng)求信息都可以通過(guò)HttpServletRequest獲得,獲取客戶端ip可以通過(guò)getRemoteAddr()獲取。
但是如果客戶端是通過(guò)代理訪問(wèn)我們的服務(wù)器,那么getRemoteAddr()獲取到的ip就很有可能不是真實(shí)的ip,這時(shí)候我們可以通過(guò)請(qǐng)求頭里的x-forwarded-for來(lái)獲取真實(shí)的ip,請(qǐng)求每經(jīng)一次代理,都會(huì)在后面拼接該代理的ip,以逗號(hào)分隔。
方法一
此方法獲取真實(shí)IP(本機(jī)IP并不是127.0.0.1)
獲取發(fā)送請(qǐng)求的電腦的IP地址,并返回
package com.lc.z.common.utils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import javax.servlet.http.HttpServletRequest; public class IpUtil { /** * 獲取請(qǐng)求的ip */ public static String getRequestIp() { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); // 從獲取RequestAttributes中獲取HttpServletRequest的信息 HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_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(); } return ip; } }
方法二
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); String clientIP = ServletUtil.getClientIP(request); // 本地的服務(wù)輸出 IP:127.0.0.1 System.out.println("IP:"+ clientIP);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java之Spring簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象
這篇文章主要介紹了Spring的讀取和存儲(chǔ)對(duì)象,獲取 bean 對(duì)象也叫做對(duì)象裝配,是把對(duì)象取出來(lái)放到某個(gè)類(lèi)中,有時(shí)候也叫對(duì)象注?,想進(jìn)一步了解的同學(xué)可以參考本文2023-04-04QTabWidget標(biāo)簽實(shí)現(xiàn)雙擊關(guān)閉的方法(推薦)
這篇文章主要介紹了QTabWidget標(biāo)簽實(shí)現(xiàn)雙擊關(guān)閉的方法(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06SpringBoot2.0集成WebSocket實(shí)現(xiàn)后臺(tái)向前端推送信息
這篇文章主要介紹了SpringBoot2.0集成WebSocket實(shí)現(xiàn)后臺(tái)向前端推送信息,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01MyBatis Plus整合Redis實(shí)現(xiàn)分布式二級(jí)緩存的問(wèn)題
Mybatis內(nèi)置的二級(jí)緩存在分布式環(huán)境下存在分布式問(wèn)題,無(wú)法使用,但是我們可以整合Redis來(lái)實(shí)現(xiàn)分布式的二級(jí)緩存,這篇文章給大家介紹MyBatis Plus整合Redis實(shí)現(xiàn)分布式二級(jí)緩存,感興趣的朋友跟隨小編一起看看吧2023-11-11如何在springboot中引入?yún)?shù)校驗(yàn)
一般我們判斷前端傳過(guò)來(lái)的參數(shù),需要對(duì)某些值進(jìn)行判斷,是否滿足條件,而springboot相關(guān)的參數(shù)校驗(yàn)注解,可以解決我們這個(gè)問(wèn)題,本文給大家介紹如何在springboot中引入?yún)?shù)校驗(yàn),感興趣的朋友一起看看吧2023-12-12Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實(shí)例解析
這篇文章主要介紹了Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02JAVA異常信息Exception?e及e的相關(guān)方法解讀
這篇文章主要介紹了JAVA異常信息Exception?e及e的相關(guān)方法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06