如何确定访问我的网站的IP地址?

时间:2012-08-24 10:35:03

标签: java jsp url java-ee servlets

我有一个Web应用程序,为此我想要捕获访问我的网站的客户端的IP地址,以便我可以知道访问该应用程序的区域最多。我在我的申请中使用Java EE

如果我们谈论标题以及从最终用户发送request时,可能会有一些解决方案。

3 个答案:

答案 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地址。它可能是代理的地址,甚至是完整的制作。