إذا تم استخدام برنامج الوكيل العكسي ، عند عكس ذلك ، فالقنين من عنوان URL الخاص بـ http://192.168.1.110:2046/ إلى عنوان URL الخاص بـ http://www.xxx.com/ ، استخدم طريقة request.getRemoteaddr () للحصول على IP العنوان الذي تم الحصول عليه باستخدام طريقة request.getRemoteaddr () هو: 127.0.0.1 أو 192.168.1.110 ، وليس IP الحقيقي للعميل.
بعد اجتياز الوكيل ، نظرًا لضيف طبقة وسيطة بين العميل والخدمة ، لا يمكن للخادم الحصول مباشرة على IP للعميل ، ولا يمكن لاتجاه جانب الخادم العودة مباشرة إلى العميل من خلال عنوان إعادة التوجيه. ومع ذلك ، في معلومات رأس HTTP لإعادة توجيه الطلب ، تتم إضافة معلومات X-Forwarded-for. تستخدم لتتبع عنوان IP العميل الأصلي وعنوان الخادم الذي يطلبه العميل الأصلي. عندما نصل إلى http://www.xxx.com/index.jsp/ ، فإن متصفحنا هو الذي يصل بالفعل إلى ملف index.jsp على الخادم ، لكن خادم الوكيل يصل أولاً إلى http: //192.168. 2046/index.jsp ، يقوم خادم الوكيل بإرجاع النتيجة التي تم الوصول إليها إلى متصفحنا. خادم الوكيل ، وليس عنوان IP للعميل.
بعد ذلك ، يمكن الحصول على طريقة للحصول على عنوان IP الحقيقي للعميل:
نسخة الكود كما يلي:
السلسلة العامة getRemortip (طلب httpservletrequest) {
if (request.getheader ("x-forwarded for") == null) {
Return request.getRemoteadDr () ؛
}
Return request.getheader ("X-forwarded-for") ؛
}
ولكن عندما أزور http://www.xxx.com/index.jsp/ ، فإن عنوان IP الذي تم إرجاعه غير معروف دائمًا ، وليس 127.0.0.1 أو 192.168.1.110 كما هو موضح أعلاه ، وأزور http: // ar in192.168. 1.110: 2046/index.jsp ، يمكن إرجاع عنوان IP الحقيقي للعميل ويتم كتابة طريقة للتحقق. السبب يكمن في الحبار. يتم تعيين العنصر الموجود في ملف تكوين Squid.conf.
لذلك ، يمكن الحصول على الطريقة الثانية للحصول على عنوان IP الحقيقي للعميل:
نسخة الكود كما يلي:
السلسلة العامة getipaddr (طلب httpservletrequest) {
string ip = request.getheader ("x-forwarded for") ؛
if (ip == null || ip.length () == 0 || "غير معروف" .equalsignorecase (IP)) {
IP = request.getheader ("Proxy-Client-IP") ؛
}
if (ip == null || ip.length () == 0 || "غير معروف" .equalsignorecase (IP)) {
IP = request.getheader ("WL-Proxy-Client-IP") ؛
}
if (ip == null || ip.length () == 0 || "غير معروف" .equalsignorecase (IP)) {
IP = request.getRemoteadDr () ؛
}
إرجاع IP ؛
}
ومع ذلك ، إذا تم تمرير وكيل عكسي متعدد المستويات ، فهناك أكثر من قيمة واحدة من X-Forwarded-For ، ولكن سلسلة من قيم 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