从HttpSessionEvent获取IP地址

时间:2016-02-17 14:19:50

标签: servlets listener ip-address httpsession

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

我的网络应用程序是2.4(不能改变这一点,我害怕):

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

这是我的会话创建方法:

public void sessionCreated(HttpSessionEvent se) {
        System.err.println("Session source: " + se.getSource());

        System.err.println("SessionLifecycleListener:sessionCreated() not implemented yet");
        HttpSession s = se.getSession();
        printAll(s.getAttributeNames(), "HttpSession attribute names");

        ServletContext sc = s.getServletContext();
        printAll(sc.getAttributeNames(), "ServletContext attribute names");
    }

如何获取HttpSessionEvent

的IP地址

1 个答案:

答案 0 :(得分:0)

这不可能通过标准的Servlet API实现。 IP地址仅可通过HttpServletRequest获取,而且只有HttpSession手头无法使用。

有些(如果不是全部)基于servlet的(MVC)框架提供了将相关HTTP请求作为线程局部变量(TLS)获取的可能性,例如JSF,Grails,Spring等。如果您没有使用这样的框架因此不能依赖它的API,那么你需要自己创建一个TLS,如本回答所示How can I get HttpServletRequest from ServletContext?最终,请在sessionCreated()中抓住它,如下所示:

HttpServletRequest request = YourContext.getCurrentInstance().getRequest();
// ...

或者,让servlet过滤器检查是否是新的,然后在那里复制IP地址。

if (session.isNew()) {
    session.setAttribute("ip", ip);
}

然后在sessionCreated()中提取。

String ip = (String) event.getSession().getAttribute("ip");

请注意,sessionDestroyed()中无法可靠地执行此操作,因为sessionDestroyed()期间不一定存在HTTP请求。另请参阅How to get request object in sessionDestroyed method?