加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 查找从给定客户端IP创建的活动会话数

发布时间:2020-12-14 05:30:21 所属栏目:Java 来源:网络整理
导读:有没有办法确定从给定的客户端IP地址创建的活动会话的数量? 解决方法 标准的Servlet API不提供这样的设施.最好的办法是自己维护一个 MapHttpSession,String (其中String是IP地址),并在每个 ServletRequest 上检查 HttpSession#isNew() ,并将其与 ServletReq
有没有办法确定从给定的客户端IP地址创建的活动会话的数量?

解决方法

标准的Servlet API不提供这样的设施.最好的办法是自己维护一个 Map<HttpSession,String>(其中String是IP地址),并在每个 ServletRequest上检查 HttpSession#isNew(),并将其与 ServletRequest#getRemoteAddr()一起添加到地图中.然后可以使用一个活动会话在 Map#values()使用 Collections#frequency().您只需确保在 HttpSessionListener#sessionDestroyed()期间从地图中删除HttpSession.

这一切都可以在实现ServletContextListener,HttpSessionListenerServletRequestListener的单个监听器中完成.

这是一个开球示例:

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");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读