Java / JSP / Sessions

时间:2016-05-25 14:10:54

标签: java jsp session

我已经在我的网络应用上实施了SessionListener来计算会话数。我有setMaxInterval(60),我的问题如下:如果会话到期,会话计数器设置为0,如果我再次开始在网页上导航,会话计数器不会递增。为什么不呢?

public class SessionListener implements HttpSessionListener {

static int counter = 0;

public void sessionCreated(HttpSessionEvent e)
{
    HttpSession s = e.getSession();

    s.setMaxInactiveInterval(60);

    counter++;

    synchronized(s.getServletContext())
    {
        s.getServletContext().setAttribute("allConnections", counter);

    }
}

public void sessionDestroyed(HttpSessionEvent e)
{
    HttpSession s = e.getSession();

    counter--;

    synchronized(s.getServletContext())
    {
        s.getServletContext().setAttribute("allConnections", counter);
    }


}

然后,每个JSP在application.getAttribute("allConnections")

上显示前端的计数器变量

2 个答案:

答案 0 :(得分:1)

这是因为对象中的计数器变量是特定于会话的(您将它作为属性或类似的东西存储在会话对象中)

您的解决方案(您选择): - 将计数器放在Application上下文/范围内(或在该范围内的单个对象中) - 使计数器变量静态(如果它在你的监听器中)

问题更新后编辑 在创建会话时,会话属性被设置一次。这意味着只会为任何给定的会话显示初始值(创建会话时适用的值)。

必须在呈现显示计数器的页面的每个请求上读取该值。你有几个选择:

  • 如果您可以在SessionListener类中提供静态getter,则JSP / servlet可以直接读取该值
  • 更好:您可以添加一个过滤器,将更新的计数器设置为请求范围中的属性。您只需要确保过滤器在显示计数器的每个请求(jsp,servlet等)上执行。

答案 1 :(得分:0)

根据此指令的值,加载JSP可能会也可能不会创建会话:

not installed