标准Servlet API并未为此提供便利。最好你可以做的是保持
Map<HttpSession,String>自己(这里
String是IP地址),并检查每个
ServletRequest如果
HttpSession#isNew()并将其添加到
Map沿
ServletRequest#getRemoteAddr()。然后,您可以使用
Collections#frequency()on
获取具有活动会话的IP地址数量
Map#values()。你只需要确保您删除
HttpSession从
Map过程中
HttpSessionListener#sessionDestroyed()。
所有这些都可以在一次
Listener实现中完成
ServletContextListener,
HttpSessionListener和
ServletRequestListener。
这是一个启动示例:
public class SessionCounter implements ServletContextListener, HttpSessionListener, ServletRequestListener { private static final String ATTRIBUTE_NAME = "com.example.SessionCounter"; private Map<HttpSession, String> sessions = new ConcurrentHashMap<HttpSession, String>(); @Override public void contextInitialized(ServletContextEvent event) { event.getServletContext().setAttribute(ATTRIBUTE_NAME, this); } @Override public void requestInitialized(ServletRequestEvent event) { HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); HttpSession session = request.getSession(); if (session.isNew()) { sessions.put(session, request.getRemoteAddr()); } } @Override public void sessionDestroyed(HttpSessionEvent event) { sessions.remove(event.getSession()); } @Override public void sessionCreated(HttpSessionEvent event) { // NOOP. Useless since we can't obtain IP here. } @Override public void requestDestroyed(ServletRequestEvent event) { // NOOP. No logic needed. } @Override public void contextDestroyed(ServletContextEvent event) { // NOOP. No logic needed. Maybe some future cleanup? } public static SessionCounter getInstance(ServletContext context) { return (SessionCounter) context.getAttribute(ATTRIBUTE_NAME); } public int getCount(String remoteAddr) { return Collections.frequency(sessions.values(), remoteAddr); }}定义
web.xml如下:
<listener> <listener-class>com.example.SessionCounter</listener-class></listener>
您可以在任何servlet中使用它,如下所示:
SessionCounter counter = SessionCounter.getInstance(getServletContext());int count = counter.getCount("127.0.0.1");


