ใน 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");
-
วิธีที่ 2 เพื่อรับที่อยู่ IP ที่แท้จริงของไคลเอนต์:
สตริงสาธารณะ getIpAddr (คำขอ HttpServletRequest) {
สตริง ip = request.getHeader("x-forwarded-for");
ถ้า (ip == null || ip.length () == 0 || "ไม่ทราบ".equalsIgnoreCase (ip)) {
ip = request.getHeader("พร็อกซี-ไคลเอ็นต์-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-ส่งต่อ-สำหรับ: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
IP จริงของผู้ใช้คือ: 192.168.1.110