我有一个Web应用程序,为此我想要捕获访问我的网站的客户端的IP地址,以便我可以知道访问该应用程序的区域最多。我在我的申请中使用Java EE
。
如果我们谈论标题以及从最终用户发送request
时,可能会有一些解决方案。
答案 0 :(得分: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中的示例用法:
使用JSTL:
在会话中使用IP地址的设定值<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)地址或发送请求的最后一个代理。
答案 1 :(得分:1)
除了上述答案(由Andrey和Stephen提供),还要使用一些analytics
工具。它将为您提供进入您网站的流量的更大图片。其中一个例子是Google Analytics。
答案 2 :(得分:0)
请求对象作为Java参数传递给从JSP生成的servlet方法。参数的名称是......等待它...... request
。
所以你应该能够在JSP中嵌入的scriptlet中引用它; e.g。
<%
InetAddress addr = request.getRemoteAddr();
// blah blah blah
%>
你是否应该在JSP中做这种事情是值得商榷的。它通常被认为是“最佳实践”,JSP应仅用于格式化输出。 Web应用程序的业务逻辑应位于控制器servlet中,然后最终转发到JSP servlet以生成HTML(或其他)。
如果要将业务逻辑放入JSP中,那么scriptlet往往难以维护......但是如果你只是要显示IP地址,那不应该是关心。 (从工程角度来看,首选方法是使用标签和JSP表达式语言。)
最后,无法保证getRemoteAddr()
返回的IP地址将是实际的客户端IP地址。它可能是代理的地址,甚至是完整的制作。