2008-11-04 29 views
6

Tôi đang phát triển một ứng dụng web với java servlet, tôi hy vọng sẽ nhận được thông tin người dùng ip bằng cách gọi request.getRemoteAddr() từ bên trong processRequest(HttpServletRequest request,HttpServletResponse response).Tại sao HttpServletRequest.getRemoteAddr() không hoạt động trong Java servlet?

Nhưng nó trả về IP sai. Vì tôi không hiểu nhiều về lĩnh vực này, tôi không biết nội dung hiển thị, có thể là proxy, tôi nhận được thông tin này:

 
RemoteAddr : 127.0.0.1 
RemoteHost : 127.0.0.1 
x-forwarded-for : null 

127.0.0.1 không phải là IP của tôi.

Tuy nhiên, khi tôi truy cập: http://www.javascriptkit.com/script/script2/displayip.shtml nó sẽ hiển thị đúng, vì tôi đang sử dụng servlet, tôi không có .shtml vào trang html được tạo động, tôi có thể làm gì? Và tại sao tập lệnh trên trang web đó có thể hiển thị chính xác trong khi request.getRemoteAddr() không thể thực hiện điều đó?

Cảm ơn tất cả các câu trả lời, tôi có một đầu mối ngay bây giờ, sau khi triển khai nó đến máy chủ, nó hoạt động như mong đợi. Hiển thị địa chỉ chính xác.

Nhưng ngay cả khi tôi phát triển nó trên máy cục bộ của tôi, làm thế nào để yêu cầu nó hiển thị IP tuyệt đối như thể nó đang chạy trên một máy chủ thực sự? Hay nó có thể làm được?

+0

Khi bạn nói 'sai ip', là địa chỉ trong miền của bạn? Nó sai thế nào? Bạn có thể cho chúng tôi biết thêm thông tin về cuộc gọi _is_ quay lại không? –

Trả lời

19

Địa chỉ IP nào đang hiển thị? Tôi đoán là có một số proxy hoặc một cái gì đó thay đổi mọi thứ. (Ví dụ: trang kịch bản đó hiển thị địa chỉ IP của bộ định tuyến ADSL của tôi - không phải là địa chỉ bên trong LAN của tôi - vì lý do hiển nhiên.)

EDIT: Bây giờ bạn đã cho thấy địa chỉ IP bạn đang xem là 127.0.0.1 câu trả lời là khá rõ ràng - bạn đang thấy bộ điều hợp loopback của bạn (tức là phím tắt cho cùng một máy) có lẽ vì bạn đang thử nghiệm trên cùng một máy mà bạn đang phát triển. Câu trả lời là hoàn toàn chính xác.

Hãy dùng thử từ một máy khác và bạn sẽ nhận được một địa chỉ IP hữu ích hơn.

+0

Đó cũng sẽ là câu hỏi của tôi. Bạn chỉ cần gõ nhanh hơn. :) – Herms

4

Kiểm tra tiêu đề X-Forwarded-For bằng cách gọi request.getHeader ("X-Forwarded-For") và xem IP nào trả về.

+0

Chúng tôi sử dụng tiêu đề này và nếu nó không có sẵn rơi vào request.getRemoteAddr() – singhspk

3

IP trả lại mà bạn đang hiển thị là IP cục bộ. Điều này đặt ra câu hỏi - bạn đang thử nghiệm ở đâu và bạn truy cập vào servlet như thế nào để kiểm tra?

Nếu bạn đang chạy servlet trên máy (phát triển) cục bộ của mình và cũng gọi nó từ trình duyệt trên cùng một máy, thì đầu ra này hoàn toàn chính xác.

Chúc mừng,

-R

1

Bạn đang chạy máy chủ thử nghiệm của bạn trên máy tính cục bộ của bạn và kết nối với nó trên http://localhost/. Vì bạn đang kết nối trên giao diện cục bộ, nguồn của kết nối cũng là localhost, còn gọi là 127.0.0.1.

1

Nếu bạn gọi servlet của mình bằng cách sử dụng http://localhost:8080/servlet, bạn thường sẽ nhận được "localhost" làm addr từ xa. Nếu bạn sử dụng tên máy của mình, tức là http://yourmachine/servlet, bạn sẽ nhận được địa chỉ "chính xác" theo cách thủ công.

+0

Nó không hoạt động! – Moesio

Các vấn đề liên quan