我正在使用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
?
答案 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?