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

具有HttpSessionListener的会话计数器和会话计数变量访问

越雨泽
2023-03-14
问题内容

我在Sun的“ Core Servlets and JavaServer Pages vol 2”中看到了带有会话计数器的示例。
计数器仅仅是建立在HttpSessionListener和递增/递减会话数与sessionCreated/ sessionDestroyed

public class SessionCounter implements HttpSessionListener {
   private int currentSessionCount = 0;

   public void sessionCreated(HttpSessionEvent event) {
       currentSessionCount++;
   }
   ...
   public int getTotalSessionCount() {
       return(totalSessionCount);
   }
   ... // counter decrement, self registering in context attribute etc.

侦听器在上下文中注册自身,因此servlets可以访问它并获取计数器值。
没有同步块。
安全,currentSessionCount不是volatile吗?

可以currentSessionCount缓存在CPU寄存器中,并且对于使用servlets


问题答案:

Servlet 3.0的规范规定(第11.5节):

侦听器实例和线程

[…]

不需要容器将结果通知同步到属性侦听器类。维护状态的侦听器类负责数据的完整性,并应明确处理这种情况。

所以不,代码不安全。使用AtomicCounter或同步对计数器的访问即可对其进行修复。

使它易失并不能使其更安全,因为++不是原子操作。因此,由于易失性,每个其他线程都将看到新值,但是由于竞争条件读取,您可能仍会错过增量,然后并行增加计数器。



 类似资料:
  • 问题内容: 是否可以在PHP中使数组成为会话变量? 情况是,我有一个表(第1页),其中有些单元格具有指向特定页面的链接。下一页将列出名称(第2页,我想保留在会话数组中)及其相应的复选框。提交此表单后,它将进入一个交易页面(第3页,其中已发布复选框的值保存在数据库中以用于对应名称)。现在,如果我返回首页并单击另一个单元格,则会话数组将包含新名称列表还是旧名称列表? 问题答案: 是的,PHP支持将数组

  • 我有多个Gatling模拟,我正试图以一种重用低级调用(即HTTP调用)的方式构建它们,同时构建不同的场景。因此,我有以下结构(为了解释当前状态,使用了echo函数): 在上面提供的测试模拟中,我们从文件中提供数据并选择我们作为Map存储到会话中的属性子集。如果在文件中找到此类属性,我们会在提交回显请求时将它们添加为表单参数。否则我们不会。在这两种情况下,我们都存储了响应正文并将其打印出来。这很好

  • 问题内容: 我需要通过过滤器访问会话变量。我什至不知道是否可能。实际上,问题在于实现的方法类型是,而HttpServlet继承了类,而doPost方法的参数是HttpServletRequest。 我可以在ServletRequest的过滤器中访问会话吗? 我应该那样做吗? 你能推荐我什么? 谢谢! 问题答案: 只需将获得的内容转换为即可。

  • 问题内容: 我有一个无状态会话bean,其中包含一个公共方法,几个私有方法和一些实例级变量。下面是一个伪代码示例。 我看到的是methodB正在打印未传递给MethodA的值。最好的说来,它是从同一bean的其他实例打印值。是什么原因造成的? 我应该指出代码在99.9%的时间内都能正常工作。但是,.01%对我造成了一些严重的问题/担忧。 我知道,如果我使用不同的公共方法,则两次调用之间可能无法获得

  • 问题内容: 有状态会话bean和HTTP会话之间有什么关系吗?我们将需要有状态会话Bean的用例是什么,而HTTP会话需要哪些用例。我可以将有状态会话Bean公开为静态Web服务吗? 问题答案: HTTP是一种无状态协议, 这意味着 它是服务器和客户端之间的实际传输协议- 是“无状态的, 因为它在调用之间不记得任何东西。 现在,首先阅读一下什么是HTTPSession和什么是Session Bea

  • 问题内容: 如果我在Django中设置会话变量,例如: 有什么方法可以从模板中访问它,还是必须从视图中检索它,然后将其传递给模板? 询问是因为我想在模板中访问大约10个小会话变量,然后将所有10个从视图传递到模板可能会有些混乱。 (我必须使用会话变量,因为它是HttpResponseRedirect,但是出于我的目的,将变量存储在数据库中是过大的。) 那么-有什么方法可以直接在模板中获取会话变量?