【问题标题】:Java / JSP / SessionsJava / JSP / 会话
【发布时间】:2016-05-25 14:10:54
【问题描述】:

我已经实现了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")显示计数器变量

【问题讨论】:

  • 显示代码中的 sn-ps 将大大有助于更准确地回答。
  • 您的原始代码对我有用。我刚刚添加了调试行以打印到控制台。我用两种方法打印了计数器的值。我还将非活动间隔更改为 6 秒。这样你就可以只看控制台并看到计数器快速上升和下降。我在桌面上使用了三种不同的浏览器(IE、Chrome 和 Firefox)。你的代码没问题。
  • 我使用单个浏览器以另一种方式测试了您的代码。它工作正常。我在桌面上创建了 JSP 的快捷方式。我浏览到该页面,然后快速关闭浏览器。我一遍又一遍地做同样的事情。
  • 很奇怪,现在它显示空值而不是 0 或 1...
  • 在 JSP 中,您应该使用:Session count is ${allConnections}

标签: java jsp session


【解决方案1】:

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

您的解决方案(您选择): - 将计数器放在应用程序上下文/范围中(或在该范围内的单例对象中) - 将计数器变量设为静态(如果它在您的侦听器中)

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

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

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

【讨论】:

  • 我已经提供了要求的样品。
  • 不幸的是,该属性存储在上下文范围内。我真的不知道出了什么问题。
  • 更新了答案。建议过滤器或每次在显示之前读取值。
  • 对不起,我还是一头雾水。我虽然getServletContext().setAttribute() 会设置一个上下文属性,它会同时为所有会话刷新。
  • 在这种情况下不是:SessionListener 是一个会话侦听器,您所依赖的方法在创建会话时仅调用一次。仅当运行 sessionCreated 时才会调用 setAttribute 方法,从而使该值之后永远不会更新。较新的会话(您可以使用不同的浏览器尝试此操作)将看到更新的值,但在不同的请求/刷新时不会看到相同的会话。
【解决方案2】:

加载 JSP 可能会也可能不会创建会话,具体取决于此指令的值:

<%@ page session="false" %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2012-07-07
    • 2011-11-08
    相关资源
    最近更新 更多