我有一個Web應用程序,爲此我想捕獲正在訪問我的網站的客戶端的IP地址,以便我可以知道訪問應用程序的最多區域。我在我的應用程序中使用Java EE
。如何確定通過什麼IP地址訪問我的網站?
如果我們談論標題,並且最終用戶發送了request
,可能有一些解決方案。
我有一個Web應用程序,爲此我想捕獲正在訪問我的網站的客戶端的IP地址,以便我可以知道訪問應用程序的最多區域。我在我的應用程序中使用Java EE
。如何確定通過什麼IP地址訪問我的網站?
如果我們談論標題,並且最終用戶發送了request
,可能有一些解決方案。
使用方法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)地址或發送請求的最後代理。
感謝您的正確方向。但是這裏的解決方法是在具有表單和提交按鈕的jsp上使用此方法的位置。或者在實際進行的最後一個servlet中,然後將數據提交給數據庫。 – Prateek
您必須有權訪問「請求」。使用[JSTL](http://www.oracle.com/technetwork/java/index-jsp-135995.html)在會話中使用IP地址的設置值:'
當我使用這種方法時,輸出在數據庫中爲'null /',而在getRemoteAddr()的情況下,數據庫輸出爲'0:0:0:0:1 /:'這意味着什麼。 – Prateek
請求對象作爲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地址。它可能是一個代理的地址,甚至是一個完整的製造。
首先,方法[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
我知道MVC,但使用像上面這樣的腳本可以幫助我以某種方式解決,即使使用隱藏參數來獲取IP地址也是不可能的。要將參數攜帶請求對象,我必須使用<%%> scrip放在某處。但是這是給錯誤的。我是否需要將它放在發送數據的同一表單中。 – Prateek
如果您只使用純JSP,那麼您可以使用scriptlets解決您的問題:'<%//您的java代碼%>'。 JSP最終轉化爲servlet的事實。因此,該代碼將以同樣的方式工作。對於一個小型測試項目來說,這是一個可以接受的解決方案,但是如果開發和成長,這些代碼將不便於理解和維護。 – kapand
隨着上述答案(安德烈和斯蒂芬)也使用一些analytics
工具也。它會給你一個更大的流量來到你的網站。一個這樣的例子是Google Analytics。
通常您的託管公司會提供這些功能 – adarshr
您選擇的servlet容器將記錄所有客戶端訪問。如果您想以編程方式獲取IP,請使用[ServletRequest.getRemoteAddr()](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29)。 –
嘿你聽說的API方法似乎很有趣。實際上,我在servlet上使用它,從jsp頁面發送請求。但它仍然沒有顯示任何價值。我是否需要使用request.getParameter方法()來達到這個目的,但是如何? – Prateek