2012-08-24 39 views
8

我有一个Web应用程序,为此我想捕获正在访问我的网站的客户端的IP地址,以便我可以知道访问应用程序的最多区域。我在我的应用程序中使用Java EE如何确定通过什么IP地址访问我的网站?

如果我们谈论标题,并且最终用户发送了request,可能有一些解决方案。

+0

通常您的托管公司会提供这些功能 – adarshr

+2

您选择的servlet容器将记录所有客户端访问。如果您想以编程方式获取IP,请使用[ServletRequest.getRemoteAddr()](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29)。 –

+0

嘿你听说的API方法似乎很有趣。实际上,我在servlet上使用它,从jsp页面发送请求。但它仍然没有显示任何价值。我是否需要使用request.getParameter方法()来达到这个目的,但是如何? – Prateek

回答

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:

使用设置的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)地址或发送请求的最后代理

+0

感谢您的正确方向。但是这里的解决方法是在具有表单和提交按钮的jsp上使用此方法的位置。或者在实际进行的最后一个servlet中,然后将数据提交给数据库。 – Prateek

+0

您必须有权访问“请求”。使用[JSTL](http://www.oracle.com/technetwork/java/index-jsp-135995.html)在会话中使用IP地址的设置值:''。然后在一个方便的地方从会话中获得这个值。在JSP中作为''或在servlet中作为'session.getAttribute('userIp');'。 – kapand

+0

当我使用这种方法时,输出在数据库中为'null /',而在getRemoteAddr()的情况下,数据库输出为'0:0:0:0:1 /:'这意味着什么。 – Prateek

0

请求对象作为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地址。它可能是一个代理的地址,甚至是一个完整的制造。

+1

首先,方法[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

+0

我知道MVC,但使用像上面这样的脚本可以帮助我以某种方式解决,即使使用隐藏参数来获取IP地址也是不可能的。要将参数携带请求对象,我必须使用<%%> scrip放在某处。但是这是给错误的。我是否需要将它放在发送数据的同一表单中。 – Prateek

+0

如果您只使用纯JSP,那么您可以使用scriptlets解决您的问题:'<%//您的java代码%>'。 JSP最终转化为servlet的事实。因此,该代码将以同样的方式工作。对于一个小型测试项目来说,这是一个可以接受的解决方案,但是如果开发和成长,这些代码将不便于理解和维护。 – kapand

1

随着上述答案(安德烈和斯蒂芬)也使用一些analytics工具也。它会给你一个更大的流量来到你的网站。一个这样的例子是Google Analytics

+0

我有一个谷歌分析帐户。但是在应用程序内部,我想根据我获得的唯一IP命中来绘制图表。对于谷歌分析不能提供帮助。 – Prateek

+0

@pks:我同意。如果你想在应用程序中使用它,那么你不能使用分析。 – pratikabu

相关问题