Servlets 从HttpSessionEvent获取IP地址

Servlets 从HttpSessionEvent获取IP地址,servlets,listener,ip-address,httpsession,Servlets,Listener,Ip Address,Httpsession,我正在使用JavaEE,并且有一个HttpSessionListener实现,我试图在客户端创建会话时使用它来获取IP地址。我该怎么做 我的webapp是2.4(恐怕无法更改): 如何获取给定HttpSessionEvent的IP地址?这是通过标准Servlet API无法实现的。IP地址仅通过HttpServletRequest可用,而当手头只有HttpSession时,IP地址将不可用 一些(如果不是所有的话)基于servlet(MVC)的框架提供了将相关HTTP请求作为线程局部变量(TLS

我正在使用JavaEE,并且有一个
HttpSessionListener
实现,我试图在客户端创建会话时使用它来获取IP地址。我该怎么做

我的webapp是2.4(恐怕无法更改):


如何获取给定
HttpSessionEvent
的IP地址?

这是通过标准Servlet API无法实现的。IP地址仅通过
HttpServletRequest
可用,而当手头只有
HttpSession
时,IP地址将不可用

一些(如果不是所有的话)基于servlet(MVC)的框架提供了将相关HTTP请求作为线程局部变量(TLS)获取的可能性,如JSF、Grails、Spring等。如果您没有使用这样的框架,因此无法依赖其API,那么您需要自己开发TLS,如本答案所示,在
sessionCreated()
中抓取它,如下所示:

HttpServletRequest request = YourContext.getCurrentInstance().getRequest();
// ...
或者,让servlet过滤器检查是否是新的,然后将IP地址复制到其中

if (session.isNew()) {
    session.setAttribute("ip", ip);
}
然后在
sessionCreated()
中提取


请注意,这在
sessionDestroyed()
中是不可靠的,因为在
sessionDestroyed()
期间不一定有HTTP请求的方式。另请参见@Sachin的副本:你在哪里读到OP正在使用Grails?我没有使用Grails,但我知道如何使用Google,并且已经看过了。
HttpServletRequest request = YourContext.getCurrentInstance().getRequest();
// ...
if (session.isNew()) {
    session.setAttribute("ip", ip);
}
String ip = (String) event.getSession().getAttribute("ip");