في JSP ، فإن طريقة الحصول على عنوان IP الخاص بالعميل هي: request.getRemoteadDr () ، وهو أمر صالح في معظم الحالات. ومع ذلك ، بعد تمرير Apache و Squid وبرامج الوكيل العكسي الأخرى ، لا يمكنك الحصول على عنوان IP الحقيقي للعميل. إذا تم استخدام برنامج الوكيل العكسي ، فإن عنوان IP الذي تم الحصول عليه باستخدام request.getRemoteadDr () طريقة: 127.0.0.1 أو 192.168.1.110 ، وليس IP الحقيقي للعميل.
بعد اجتياز الوكيل ، نظرًا لضيف طبقة وسيطة بين العميل والخدمة ، لا يمكن للخادم الحصول مباشرة على IP للعميل ، ولا يمكن لاتجاه جانب الخادم العودة مباشرة إلى العميل من خلال عنوان إعادة التوجيه. ومع ذلك ، في معلومات رأس HTTP لإعادة توجيه الطلب ، تتم إضافة معلومات X-Forwarded-for. تستخدم لتتبع عنوان IP العميل الأصلي وعنوان الخادم الذي يطلبه العميل الأصلي. عندما نصل إلى index.jsp/، فإنه ليس أن متصفحنا يصل فعليًا إلى ملف index.jsp على الخادم. بدلاً من ذلك ، يقوم خادم الوكيل أولاً بالوصول إلى index.jsp ، ويعيد خادم الوكيل النتيجة التي تم الوصول إليها إلى متصفحنا. نظرًا لأن خادم الوكيل يصل إلى index.jsp ، فإن IP الذي تم الحصول عليه بواسطة request.getRemoteadDr () في index.jsp هو في الواقع عنوان خادم الوكيل ، وليس عنوان IP الخاص بالعميل.
لذلك ، يمكن الحصول على طريقة للحصول على عنوان IP الحقيقي للعميل:
السلسلة العامة getRemortip (طلب httpservletrequest) {if (request.getheader ("x-forwarded-for") == null) {return request.getRemoteadDr () ؛ } Return request.getheader ("X-forwarded-for") ؛ }الطريقة 2 للحصول على عنوان IP الحقيقي للعميل:
السلسلة العامة getipaddr (طلب httpservletrequest) {string ip = request.getheader ("x-forwarded for") ؛ if (ip == null || ip.length () == 0 || } if (ip == null || ip.length () == 0 || "غير معروف" .equalsignoreCase (IP)) {ip = request.getheader ("wl-proxy-client-ip") ؛ } if (ip == null || ip.length () == 0 || } إرجاع IP ؛ }ومع ذلك ، إذا تم تمرير وكيل عكسي متعدد المستويات ، فهناك أكثر من قيمة واحدة من 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