في JSP، طريقة الحصول على عنوان IP الخاص بالعميل هي: request.getRemoteAddr(). هذه الطريقة فعالة في معظم الحالات. ومع ذلك، لا يمكن الحصول على عنوان IP الحقيقي للعميل من خلال برامج الوكيل العكسي مثل Apache وSquid. إذا تم استخدام برنامج الوكيل العكسي، فإن عنوان IP الذي تم الحصول عليه باستخدام طريقة request.getRemoteAddr() هو: 127.0.0.1 أو 192.168.1.110، وليس عنوان IP الحقيقي للعميل.
بعد المرور عبر الوكيل، نظرًا لإضافة طبقة وسيطة بين العميل والخدمة، لا يمكن للخادم الحصول مباشرة على عنوان IP الخاص بالعميل، ولا يمكن للتطبيق من جانب الخادم إرجاع عنوان الطلب المعاد توجيهه مباشرة إلى العميل. ومع ذلك، تتم إضافة معلومات X-FORWARDED-FOR إلى معلومات رأس HTTP للطلب المُعاد توجيهه. يستخدم لتتبع عنوان IP الأصلي للعميل وعنوان الخادم الذي طلبه العميل الأصلي. عندما نصل إلى ملف Index.jsp/، فإن متصفحنا ليس هو الذي يصل فعليًا إلى ملف Index.jsp الموجود على الخادم، وبدلاً من ذلك، يصل الخادم الوكيل أولاً إلى ملف Index.jsp، ويعيد الخادم الوكيل النتائج التي تم الوصول إليها إلينا. نظرًا لأن الخادم الوكيل يصل إلى ملف Index.jsp، فإن عنوان IP الذي تم الحصول عليه من خلال طريقة request.getRemoteAddr() في ملف Index.jsp هو في الواقع عنوان الخادم الوكيل، وليس عنوان IP الخاص بالعميل.
لذا يمكننا التوصل إلى الطريقة الأولى للحصول على عنوان IP الحقيقي للعميل:
سلسلة getRemortIP العامة (طلب HttpServletRequest) {
إذا (request.getHeader("x-forwarded-for") == null) {
إرجاع request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
الطريقة الثانية للحصول على عنوان IP الحقيقي للعميل:
سلسلة getIpAddr العامة (طلب HttpServletRequest) {
String ip = request.getHeader("x-forwarded-for");
إذا (ip == null || ip. length() == 0 || "غير معروف".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
إذا (ip == null || ip. length() == 0 || "غير معروف".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
إذا (ip == null || ip. length() == 0 || "غير معروف".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
عودة الملكية الفكرية.
}
ومع ذلك، إذا تم تمرير وكيل عكسي متعدد المستويات، فإن قيمة X-Forwarded-For ليست مجرد قيمة واحدة، بل سلسلة من قيم IP. أي منها هو عنوان IP الحقيقي للعميل الحقيقي؟
الجواب هو أخذ أول سلسلة IP صالحة غير معروفة في X-Forwarded-For. يحب:
X-Forwarded-For: 192.168.1.110، 192.168.1.120، 192.168.1.130، 192.168.1.100
عنوان IP الحقيقي للمستخدم هو: 192.168.1.110