我有一个 Web 应用程序,为此我想捕获正在访问我的网站的客户端的 IP 地址,以便我可以知道哪个区域最常访问该应用程序。我Java EE
在我的应用程序中使用。
如果我们谈论标头以及何时request
从最终用户发送,可能会有一些解决方案。
我有一个 Web 应用程序,为此我想捕获正在访问我的网站的客户端的 IP 地址,以便我可以知道哪个区域最常访问该应用程序。我Java EE
在我的应用程序中使用。
如果我们谈论标头以及何时request
从最终用户发送,可能会有一些解决方案。
使用接口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) 地址。
除了上述答案(安德烈和斯蒂芬)之外,还使用了一些analytics
工具。它会让您更全面地了解进入您网站的流量。一个这样的例子是谷歌分析。
请求对象作为 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 地址。它可能是代理的地址,甚至是完全虚构的。