当前位置: 首页 > 面试题库 >

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

夹谷阳夏
2023-03-14
问题内容

有没有一种方法可以确定从给定客户端IP地址创建的活动会话数?


问题答案:

标准Servlet API并未为此提供便利。最好你可以做的是保持Map<HttpSession, String>自己(这里String是IP地址),并检查每个ServletRequest如果HttpSession#isNew()并将其添加到Map沿ServletRequest#getRemoteAddr()。然后,您可以使用Collections#frequency()on
获取具有活动会话的IP地址数量Map#values()。你只需要确保您删除HttpSessionMap过程HttpSessionListener#sessionDestroyed()

所有这些都可以在一次Listener实现中完成ServletContextListenerHttpSessionListenerServletRequestListener

这是一个启动示例:

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


 类似资料:
  • 问题内容: 根据EJB客户端应用程序上的Netbeans教程,我似乎无法调用该方法: 编译错误: 客户: ejb: 远程接口: 现在,如果接口被修改: Bean现在可以使用以下方法: 但是,有一个NPE: 如何正确调用该方法?EJB未实例化? 问题答案: 我从头开始。我能想到的唯一区别是,我没有创建EJB应用程序,而是为bean创建了EJB模块。否则,我认为是相同的。 结构体: 客户代码: 豆:

  • 问题内容: 我有一个脚本,该脚本将由使用SSH登录到服务器的人运行。 有没有一种方法可以自动找出用户连接的IP地址? 当然,我可以问用户(这是程序员的工具,所以没问题),但是如果我发现的话,它会更酷。 问题答案: 检查是否有一个环境变量称为: 要么 (或任何其他环境变量)在用户登录时设置。然后使用用户登录脚本对其进行处理。 提取IP:

  • 创建客户端有两种方式,一种是直接使用特化的构造器函数,另一种是使用工厂构造器函数。 第一种方式返回的是具体的客户端结构体指针对象,第二种方式返回的是客户端接口对象。 使用特化的构造器函数创建客户端 特化的构造器函数有下面几个: func NewHTTPClient(uri ...string) (client *HTTPClient) func NewTCPClient(uri ...string

  • 我正在尝试将来自java应用程序的消息排入jms队列(weblogic)。 当我调用getInitalContext()方法时,它工作得很好。我了解了背景。但在尝试使用上下文获取连接工厂时,会出现以下错误: 查看Weblogic控制台,JNDI树我有以下内容: JMS: ConnectionFactory: name: bfred1cf class Name:weblogic.rmi.cluste

  • 问题内容: 我需要知道客户的IP地址,这是我的鳕鱼 处理程序: 结果: 为什么我无法获得真正的客户IP? 问题答案: 通常,您可以用来获取正在访问Web应用程序的客户端的IP地址。但是,如果用户位于代理服务器后面或通过负载均衡器访问您的Web服务器(例如,在云托管中),则上述代码段将获取代理服务器或负载均衡器服务器的IP地址,而不是原始IP地址客户。 因此,您应该获得请求的HTTP标头“ X-Fo

  • 我想使用证书凭据将文件上载到s3。是否可以使用certifcate获取s3 bucket的客户机对象? 最初,我尝试使用下面的命令上传一个文件, 现在,我不想使用ACCESS_KEY | SECRET_KEY来创建客户机对象,因为它正在边缘设备上运行。相反,我已经生成了证书(IOT)。我想使用此证书创建客户端对象。因此,最后我有了临时访问权|密钥|秘密|会话|令牌。我想传递这些临时凭据以创建客户端