我有一个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