2012-08-24 47 views
8

Tôi có một ứng dụng web và tôi muốn chụp địa chỉ IP của các khách hàng đang truy cập vào trang web của tôi để tôi có thể biết khu vực nào đang truy cập nhiều nhất vào ứng dụng. Tôi đang sử dụng Java EE trong đơn đăng ký của mình.Làm cách nào để xác định địa chỉ IP mà trang web của tôi đã truy cập?

Có thể có một số giải pháp nếu chúng ta nói về tiêu đề và khi request được gửi từ người dùng cuối.

+0

Thông thường công ty lưu trữ của bạn sẽ cung cấp các tính năng như vậy – adarshr

+2

Vùng chứa servlet mà bạn chọn sẽ ghi lại tất cả các truy cập của khách hàng. Nếu bạn muốn nhận IP theo chương trình, hãy sử dụng [ServletRequest.getRemoteAddr()] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29). –

+0

Hey phương pháp API bạn đã nói có vẻ thú vị. Tôi thực sự sử dụng nó trên servlet của tôi mà yêu cầu được gửi từ trang jsp. Nhưng nó vẫn không hiển thị bất kỳ giá trị nào. Tôi có cần sử dụng phương thức request.getParameter() cho mục đích này không, nhưng làm thế nào ??? – Prateek

Trả lời

15

Sử dụng phương pháp getRemoteAddr() từ giao diện ServletRequest hoặc các phương pháp getHeaders() hình thức giao diện HttpServletRequest:

HttpServletRequest httpRequest = (HttpServletRequest) request; 
String userIpAddress = httpRequest.getHeader("X-Forwarded-For"); 

Có một cách thận trọng cho việc sử dụng phương pháp getRemoteAddr:

Chắc chắn bạn có thể sử dụng phương pháp này và trong trường hợp chung, bạn sẽ nhận được IP của khách hàng. Tuy nhiên, phương pháp này là vô ích nếu người dùng đứng sau proxy. Trong trường hợp này, bạn sẽ nhận được địa chỉ IP của máy chủ proxy chứ không phải máy khách. Tuy nhiên, proxy có thể bao gồm IP ứng dụng khách yêu cầu trong tiêu đề đặc biệt HTTP. Vì vậy, để lấy phương thức gọi thực IP-client getHeader("X-Forwarded-For").

Một cách sử dụng ví dụ trong JSP:

Sử dụng giá trị đặt địa chỉ IP trong phiên sử dụng JSTL:

<c:set var="userIp" value="${requestScope.header('x-forwarded-for')}" scope="session" /> 

Và sau đó nhận được giá trị này trong phiên làm việc ở một nơi thuận tiện.

Trong JSP bạn có thể sử dụng <c:out value="${sessionScope.userIp}" /> hoặc trong servlet như session.getAttribute('userIp');

Vui lòng đọc docs:

java.lang.String getRemoteAddr() trả về địa chỉ IP (Internet Protocol) của khách hàng hoặc proxy cuối cùng đã gửi yêu cầu.

+0

Cảm ơn bạn đã đi đúng hướng. Nhưng sửa chữa ở đây là nơi để sử dụng phương pháp này trên jsp đó là có hình thức và nút gửi. Hoặc bên trong servlet cuối cùng nơi nó thực sự đi và sau đó gửi dữ liệu đến cơ sở dữ liệu. – Prateek

+0

Bạn phải có quyền truy cập vào 'yêu cầu'. Sử dụng giá trị thiết lập của địa chỉ IP trong phiên sử dụng [JSTL] (http://www.oracle.com/technetwork/java/index-jsp-135995.html): ''. Và sau đó nhận giá trị này từ phiên ở một nơi thuận tiện. Trong JSP là '' hoặc trong servlet là 'session.getAttribute ('userIp');'. – kapand

+0

Khi tôi sử dụng phương pháp này thì đầu ra có 'null /' trong cơ sở dữ liệu, trong khi trong trường hợp của getRemoteAddr() đầu ra cơ sở dữ liệu xuất hiện dưới dạng '0: 0: 0: 0: 0: 1 /:' nghĩa là gì. – Prateek

0

Đối tượng yêu cầu được chuyển như đối số Java cho phương thức servlet được tạo từ JSP của bạn. Tên của đối số là ... đợi cho nó ... request.

Vì vậy, bạn có thể tham khảo nó trong tập lệnh được nhúng trong JSP của bạn; ví dụ.

<% 
     InetAddress addr = request.getRemoteAddr(); 
     // blah blah blah 
    %> 

Điều gây tranh cãi là bạn có nên thực hiện loại điều này trong JSP hay không. Nó thường được chấp nhận là "thực hành tốt nhất" mà JSPs nên chỉ được sử dụng để định dạng đầu ra. Logic nghiệp vụ của một webapp phải nằm trong một servlet điều khiển mà cuối cùng chuyển tiếp đến servlet JSP để tạo ra HTML (hoặc bất kỳ thứ gì).

Nếu bạn định đưa logic nghiệp vụ vào JSP, tập lệnh có xu hướng khó duy trì ... mặc dù nếu bạn đang chỉ sẽ hiển thị địa chỉ IP, điều đó không đáng lo ngại. (Cách tiếp cận ưa thích từ góc độ kỹ thuật là sử dụng các thẻ và ngôn ngữ biểu thức JSP.)

Cuối cùng, không có gì đảm bảo rằng địa chỉ IP được trả về bởi getRemoteAddr() sẽ là địa chỉ IP khách hàng thực tế. Nó có thể là địa chỉ của một proxy, hoặc thậm chí là một chế tạo hoàn chỉnh.

+1

Đầu tiên, phương thức [getRemoteAddr()] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29) thuộc về giao diện [ServletRequest] (http : //docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29) và nó không yêu cầu truyền một yêu cầu đến [HttpServletRequest] (http: // docs. oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html). Bên cạnh đó, phương thức này Phương thức này có thể không phải lúc nào cũng trả về địa chỉ IP của người dùng. Trong tập lệnh thứ ba là thực hành không tốt. – kapand

+0

Tôi biết MVC nhưng bằng cách sử dụng một scrip cho phép như trên có thể giúp tôi bằng cách nào đó để giải quyết như nó không thể thậm chí bằng cách sử dụng một tham số ẩn để có được địa chỉ IP. Để thực hiện tham số với đối tượng yêu cầu, tôi phải sử dụng đoạn mã <%%> để ở đâu đó. Nhưng đây là lỗi. Tôi có cần đặt nó trong cùng một biểu mẫu đang gửi dữ liệu không. – Prateek

+0

Trong trường hợp bạn chỉ sử dụng JSP thuần túy thì bạn có thể giải quyết vấn đề của mình bằng cách sử dụng tập lệnh: '<% // mã java của bạn%>'. Thực tế là JSP cuối cùng đã biến thành một servlet. Do đó mã này sẽ hoạt động theo cùng một cách. Đây là một giải pháp chấp nhận được đối với một dự án thử nghiệm nhỏ nhưng mã như vậy sẽ bất tiện để hiểu và duy trì nếu nó sẽ phát triển và phát triển. – kapand

1

Cùng với các câu trả lời đã nói ở trên (bởi Andrey và Stephen), hãy sử dụng một số công cụ analytics. Nó sẽ cung cấp cho bạn một bức tranh lớn hơn về lưu lượng truy cập đến trang web của bạn. Một ví dụ như vậy là Google Analytics.

+0

Tôi có tài khoản Google Analytics. Nhưng bên trong ứng dụng, tôi muốn vẽ đồ thị dựa trên những gì mà tôi đạt được. Google Analytics không thể giúp được. – Prateek

+0

@pKs: tôi đồng ý. nếu u muốn tiêu thụ nó trong ứng dụng của bạn thì u không thể sử dụng phân tích. – pratikabu

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