登录时获取用户IP

Posted

技术标签:

【中文标题】登录时获取用户IP【英文标题】:Getting user IP on log in 【发布时间】:2017-11-29 18:25:04 【问题描述】:

我目前设置了一个 Web 项目,并在 Apache Tomcat 8.0 服务器上设置了基于表单的 JDBC 领域身份验证。

我想使用 HttpServletRequest 类将登录到数据库的用户的 IP 地址存储起来。

我应该在我的 Web 应用程序中的什么位置(即在什么操作之后)添加此功能?

我正在使用 JSP/Servlet、Tomcat 和 mysql

谢谢!

【问题讨论】:

【参考方案1】:

您可以为此使用 servlet 过滤器。 servlet 过滤器可用于拦截传入的 HTTP servlet 请求并对请求执行任何您喜欢的操作或记录条目。

请注意,Tomcat 默认还有一个访问日志,其中包含所有 HTTP 请求、它们的状态、IP 和用户名(如果有)。这是一个例子。

192.168.0.47 - - [27/Nov/2017:07:18:07 -0600] "GET /example/module?wsdl HTTP/1.1" 200 3122
192.168.0.47 - - [27/Nov/2017:07:18:07 -0600] "POST /otherapp/service HTTP/1.1" 200 251
fe80:0:0:0:fc36:e3bb:5bc4:abce%14 - asm-admin [27/Nov/2017:07:18:08 -0600] "POST /otherapp/HEARTBEAT/?v-uiId=0 HTTP/1.1" 200 -
fe80:0:0:0:fc36:e3bb:5bc4:abce%14 - asm-admin [27/Nov/2017:07:18:18 -0600] "POST /otherapp/HEARTBEAT/?v-uiId=0 HTTP/1.1" 200 -
fe80:0:0:0:fc36:e3bb:5bc4:abce%14 - asm-admin [27/Nov/2017:07:18:28 -0600] "POST /otherapp/HEARTBEAT/?v-uiId=0 HTTP/1.1" 200 -

【讨论】:

我在哪里可以找到这个日志?另外,我如何能够判断哪个请求是登录请求,以及如何使用它来发布到我的数据库? 您会知道这是一个登录请求,因为它进入了登录页面。你会知道这是一个失败的登录请求,因为代码是 HTTP 401。你会知道 authN 是成功的,但是用户没有正确的权限,因为代码是 403。这个日志文件在 TOMCAT_HOME/logs 中。在这里查看更多信息:techstacks.com/howto/configure-access-logging-in-tomcat.html 这行得通,谢谢!目前我只从 getRemoteAddr 获得 0.0.0.0.0.1,但这对于 localhost 来说是正确的,对吧? 您能否解释一下何时过滤器被触发?现在它里面的代码似乎正在运行多次(不仅仅是在启动时) 过滤器针对每个到达该路径的 http 请求/响应运行【参考方案2】:

成功登录后,您可以从请求中获取用户名和IP地址并进一步处理。我认为,挑战在于,在登录后立即获取它,因为基于 tomcats 表单的登录非常透明。 如果值不在会话中,我通过将用户名保存在会话对象中并仅保存数据来解决它。可能您必须考虑到会话可能会过期。

【讨论】:

存储该会话数据的“触发器”是什么? 这可能是如果 sessionobject 'user' 如果未设置则返回 null 和值。类似于: if ( session.getAttribute("user.name") == null ) saveEntry(); session.setAttribute("user.name", request.getRemoteUser()) ;

以上是关于登录时获取用户IP的主要内容,如果未能解决你的问题,请参考以下文章

java获取登录用户ip地址

获取登录用户ip

使用百度定位Api获取当前用户登录地址

SpringBoot 获取当前登录用户IP

用户运行托管 IIS 链接时如何在 asp.net 中获取客户端 IP 地址

java后台怎么获取前台用户登录信息 包括 ip 登录时间