java web(HttpServletRequest)獲取用戶真實ip的方式

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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章