8

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

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

4

3 回答 3

15

使用接口ServletRequest中的方法getRemoteAddr()或接口HttpServletRequest中的方法getHeaders()

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');

请阅读文档

java.lang.String getRemoteAddr()返回发送请求的客户端或最后一个代理的 Internet 协议 (IP) 地址。

于 2012-08-24T10:51:21.687 回答
1

除了上述答案(安德烈和斯蒂芬)之外,还使用了一些analytics工具。它会让您更全面地了解进入您网站的流量。一个这样的例子是谷歌分析

于 2012-08-24T11:24:56.893 回答
0

请求对象作为 Java 参数传递给从 JSP 生成的 servlet 方法。参数的名称是...等等request...。

因此,您应该能够在嵌入在 JSP 中的 scriptlet 中引用它;例如

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

您是否应该在 JSP 中做这种事情是有争议的。JSP 应该只用于格式化输出,这被普遍接受为“最佳实践” 。webapp 的业务逻辑应该在控制器 servlet 中,然后最终转发到 JSP servlet 以生成 HTML(或其他)。

如果您打算将业务逻辑放入 JSP 中,则 scriptlet 往往难以维护……但如果您只是要显示 IP 地址,则不必担心。(从工程角度来看,首选的方法是使用标签和 JSP 表达式语言。)

最后,不能保证返回的 IP 地址getRemoteAddr()是实际的客户端 IP 地址。它可能是代理的地址,甚至是完全虚构的。

于 2012-08-24T11:21:19.050 回答