java web(HttpServletRequest)獲取用戶真實ip的方式
最近因爲項目需要,看了一下java web獲取用戶請求的真實ip的方法。
1. 因爲真實的線上項目基本上都是通過nginx轉發的,所以獲取的方式一般是通過HttpServletRequest.getHeader("x-forwarded-for")
方法,但是有個問題就是因爲這個只是一個請求頭,所以可能出現的問題是請求方可以僞造該ip地址的。
2. 獲取上一級請求的ip地址,通過HttpServletRequest.getRemoteAddr()
獲取上一級請求的ip地址,這個方法是通過http協議握手獲取的,所以這個ip地址是用戶無法僞造的,但是有一個問題就是,通過nginx轉發的話獲取的就是轉發服務器的ip地址。
以下是代碼示例:
private String getClientIp(HttpServletRequest request) {
//X-Forwarded-For,不區分大小寫
String possibleIpStr = request.getHeader("X-Forwarded-For");
String remoteIp = request.getRemoteAddr();
String clientIp;
if (StringUtils.isNotBlank(possibleIpStr) && !"unknown".equalsIgnoreCase(possibleIpStr)) {
//可能經過好幾個轉發流程,第一個是用戶的真實ip,後面的是轉發服務器的ip
clientIp = possibleIpStr.split(",")[0].trim();
} else {
//如果轉發頭ip爲空,說明是直接訪問的,沒有經過轉發
clientIp = remoteIp;
}
return clientIp;
}