使用Java實(shí)現(xiàn)獲取客戶端IP地址
首先是獲取 IP,直接上代碼
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; /** * 獲取IP地址工具類 */ public final class IpUtil { private static final String UNKNOWN = "unknown"; private static final String IPV6_LOCAL = "::1"; // 推薦用壓縮形式 private IpUtil(){ throw new AssertionError(); } /** * 獲取請(qǐng)求用戶的IP地址 * @return */ public static String getRequestIp() { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); return getRequestIp(request); } /** * 獲取請(qǐng)求用戶的IP地址 * @param request * @return */ public static String getRequestIp(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); // 處理多級(jí)代理,獲取第一個(gè)非 unknown 的有效 IP if (ip != null && !ip.isEmpty() && !UNKNOWN.equalsIgnoreCase(ip)) { ip = ip.split(",")[0].trim(); // 取第一個(gè) IP } else { ip = request.getHeader("X-Real-IP"); // 常見于 Nginx 代理 } // 備用方案:嘗試從其他頭部獲取 if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); // 默認(rèn)獲取遠(yuǎn)程地址 } // 如果是本地回環(huán)地址,則返回本地機(jī)器的 IP if (IPV6_LOCAL.equals(ip) || "127.0.0.1".equals(ip)) { ip = getLocalhostIp(); // 獲取本地 IP } return ip; } private static String getLocalhostIp() { try { InetAddress inetAddress = InetAddress.getLocalHost(); return inetAddress.getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); return "127.0.0.1"; // 如果無(wú)法獲取,則返回回環(huán)地址 } } }
但是今天發(fā)現(xiàn)一個(gè)問(wèn)題,所有的地址都顯示為 127.0.0.1,我一琢磨應(yīng)該是 nginx 代理導(dǎo)致的,所以給 nginx 加上下面的配置
server { listen 80; server_name your-domain.com; location / { # 轉(zhuǎn)發(fā)客戶端的真實(shí) IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; # 代理轉(zhuǎn)發(fā)請(qǐng)求到網(wǎng)關(guān)服務(wù) proxy_pass http://localhost:1000/; } }
重啟 nginx 后再次請(qǐng)求就拿到了真實(shí)的 IP 地址了(注意所謂的真實(shí) IP 不一定真實(shí),這個(gè)東西是可以偽造的,至于防范措施大家自己去搜,道高一尺魔高一丈)
到此這篇關(guān)于使用Java實(shí)現(xiàn)獲取客戶端IP地址的文章就介紹到這了,更多相關(guān)Java獲取客戶端IP地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea普通javaweb項(xiàng)目如何部署到tomcat(讀取web.xml文件)
這篇文章主要介紹了idea普通javaweb項(xiàng)目如何部署到tomcat(讀取web.xml文件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Java 8對(duì)LinkedHashSet元素進(jìn)行排序的操作方法
LinkedHashSet 是 Java 集合框架中的一個(gè)類,它繼承自 HashSet,并實(shí)現(xiàn)了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它僅僅保持插入順序,所以本文給大家介紹了Java 8 如何對(duì) LinkedHashSet 元素進(jìn)行排序,需要的朋友可以參考下2024-11-11mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐
本文主要介紹了mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06解決運(yùn)行jar包出錯(cuò):ClassNotFoundException問(wèn)題
這篇文章主要介紹了解決運(yùn)行jar包出錯(cuò):ClassNotFoundException問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12