2012-08-24 98 views
8

我有一個Web應用程序,爲此我想捕獲正在訪問我的網站的客戶端的IP地址,以便我可以知道訪問應用程序的最多區域。我在我的應用程序中使用Java EE如何確定通過什麼IP地址訪問我的網站?

如果我們談論標題,並且最終用戶發送了request,可能有一些解決方案。

+0

通常您的託管公司會提供這些功能 – adarshr

+2

您選擇的servlet容器將記錄所有客戶端訪問。如果您想以編程方式獲取IP,請使用[ServletRequest.getRemoteAddr()](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29)。 –

+0

嘿你聽說的API方法似乎很有趣。實際上,我在servlet上使用它,從jsp頁面發送請求。但它仍然沒有顯示任何價值。我是否需要使用request.getParameter方法()來達到這個目的,但是如何? – Prateek

回答

15

使用方法getRemoteAddr()從接口ServletRequest或方法getHeaders()接口形式HttpServletRequest

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

有一個謹慎使用方法爲getRemoteAddr

當然你可以使用的方法和一般情況下,你會得到客戶的IP。但是,如果用戶位於代理之後,該方法將毫無用處。在這種情況下,您將獲得代理服務器的IP地址,而不是客戶端。但代理服務器可能會在特殊的HTTP標頭中包含請求的客戶端IP。所以要檢索真實客戶端-IP呼叫方法getHeader("X-Forwarded-For")

使用示例在JSP:

使用設置的IP地址的會話中使用JSTL值:

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

,然後在方便的地方得到會話此值。

在JSP中,你可以使用<c:out value="${sessionScope.userIp}" />或servlet作爲session.getAttribute('userIp');

請閱讀docs

java.lang.String中的getRemoteAddr()返回客戶端的Internet協議(IP)地址或發送請求的最後代理

+0

感謝您的正確方向。但是這裏的解決方法是在具有表單和提交按鈕的jsp上使用此方法的位置。或者在實際進行的最後一個servlet中,然後將數據提交給數據庫。 – Prateek

+0

您必須有權訪問「請求」。使用[JSTL](http://www.oracle.com/technetwork/java/index-jsp-135995.html)在會話中使用IP地址的設置值:''。然後在一個方便的地方從會話中獲得這個值。在JSP中作爲''或在servlet中作爲'session.getAttribute('userIp');'。 – kapand

+0

當我使用這種方法時,輸出在數據庫中爲'null /',而在getRemoteAddr()的情況下,數據庫輸出爲'0:0:0:0:1 /:'這意味着什麼。 – Prateek

0

請求對象作爲Java參數傳遞給從JSP生成的servlet方法。爭論的名字是...等着它... request

所以你應該能夠在JSP中嵌入的scriptlet中引用它;例如

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

你是否應該在JSP中做這種事情是值得商榷的。通常被認爲是「最佳實踐」,即JSP應該使用只有用於格式化輸出。一個webapp的業務邏輯應該在一個控制器servlet中,然後最終轉發到JSP servlet來生成HTML(或其他)。

如果您打算將業務邏輯放入JSP中,scriptlets往往難以維護......但如果您是只是要顯示IP地址,那就不應該擔心。 (從工程角度來看,首選的方法是使用標籤和JSP表達式語言。)

最後,不能保證getRemoteAddr()返回的IP地址將是實際的客戶端IP地址。它可能是一個代理的地址,甚至是一個完整的製造。

+1

首先,方法[getRemoteAddr()](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29)屬於接口[ServletRequest](http ://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29),並且它不需要向[HttpServletRequest](http:// docs。 oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html)。此外,這種方法該方法可能並不總是返回用戶IP地址。第三個腳本是不好的做法。 – kapand

+0

我知道MVC,但使用像上面這樣的腳本可以幫助我以某種方式解決,即使使用隱藏參數來獲取IP地址也是不可能的。要將參數攜帶請求對象,我必須使用<%%> scrip放在某處。但是這是給錯誤的。我是否需要將它放在發送數據的同一表單中。 – Prateek

+0

如果您只使用純JSP,那麼您可以使用scriptlets解決您的問題:'<%//您的java代碼%>'。 JSP最終轉化爲servlet的事實。因此,該代碼將以同樣的方式工作。對於一個小型測試項目來說,這是一個可以接受的解決方案,但是如果開發和成長,這些代碼將不便於理解和維護。 – kapand

1

隨着上述答案(安德烈和斯蒂芬)也使用一些analytics工具也。它會給你一個更大的流量來到你的網站。一個這樣的例子是Google Analytics

+0

我有一個谷歌分析帳戶。但是在應用程序內部,我想根據我獲得的唯一IP命中來繪製圖表。對於谷歌分析不能提供幫助。 – Prateek

+0

@pks:我同意。如果你想在應用程序中使用它,那麼你不能使用分析。 – pratikabu

相關問題