假设,我有一个拥有大量servlet的Web服务器.对于在这些servlet之间传递的信息,我正在设置会话和实例变量.
现在,如果有2个或更多用户向此服务器发送请求,那么会话变量会发生什么?它们对所有用户都是通用的,或者对于每个用户而言都是不同的.如果它们不同,那么服务器如何区分不同的用户?
还有一个类似的问题,如果有n用户访问特定的servlet,那么这个servlet只在第一个用户第一次访问它时实例化,或者是否为所有用户单独实例化?换句话说,实例变量会发生什么?
java multithreading servlets session-variables instance-variables
更新:解决方案后问题.
通常,同步是在JVM内串行化并行请求,例如
private static final Object LOCK = new Object();
public void doSomething() {
...
synchronized(LOCK) {
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
在查看Web应用程序时,"JVM全局"范围上的某些同步可能会成为性能瓶颈,仅在用户的HttpSession范围内进行同步会更有意义.
以下代码是否可能?我怀疑同步会话对象是一个好主意,但听到你的想法会很有趣.
HttpSession session = getHttpServletRequest().getSession();
synchronized (session) {
...
}
Run Code Online (Sandbox Code Playgroud)
关键问题:对于处理来自同一用户的请求的所有线程
,是否保证会话对象是同一个实例?
看来会话对象本身并不总是相同,它依赖于servlet容器(Tomcat,Glassfish,...)的实现,并且该getSession()方法可能只返回一个包装器实例.
因此,建议使用存储在会话中的自定义变量作为锁定对象.
这是我的代码提案,欢迎提供反馈:
帮手类中的某个地方,例如MyHelper:
private static final Object LOCK = new Object();
public static Object getSessionLock(HttpServletRequest request, String lockName) {
if (lockName == null) lockName = "SESSION_LOCK";
Object result = request.getSession().getAttribute(lockName);
if (result == …Run Code Online (Sandbox Code Playgroud) 我希望能够以编程方式注销所有登录用户.如何在某些事件上强制注销所有用户?
我正在使用OpenID.如何使用户即使关闭浏览器窗口后仍能长时间登录?
如何存储和访问用户的User对象?
基本上,我想我真的不明白会话如何在Java中运行.
我想在客户端获取Tomcat的JSESSIONID.那可能吗?如果有,怎么样?
谢谢