相关疑难解决方法(0)

servlet如何工作?实例化,会话,共享变量和多线程

假设,我有一个拥有大量servlet的Web服务器.对于在这些servlet之间传递的信息,我正在设置会话和实例变量.

现在,如果有2个或更多用户向此服务器发送请求,那么会话变量会发生什么?它们对所有用户都是通用的,或者对于每个用户而言都是不同的.如果它们不同,那么服务器如何区分不同的用户?

还有一个类似的问题,如果有n用户访问特定的servlet,那么这个servlet只在第一个用户第一次访问它时实例化,或者是否为所有用户单独实例化?换句话说,实例变量会发生什么?

java multithreading servlets session-variables instance-variables

1105
推荐指数
6
解决办法
28万
查看次数

HttpSession中的同步是否可行?

更新:解决方案后问题.

题:

通常,同步是在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)

java session multithreading synchronization servlets

30
推荐指数
3
解决办法
2万
查看次数

如何在spring-security中注销所有登录用户?

我希望能够以编程方式注销所有登录用户.如何在某些事件上强制注销所有用户?

java authentication spring spring-security logout

19
推荐指数
1
解决办法
5461
查看次数

如何让用户登录我的网站好几个月?

我正在使用OpenID.如何使用户即使关闭浏览器窗口后仍能长时间登录?

如何存储和访问用户的User对象?

基本上,我想我真的不明白会话如何在Java中运行.

java openid session servlets login

17
推荐指数
2
解决办法
9906
查看次数

如何在客户端获取Tomcat JSESSIONID?

我想在客户端获取Tomcat的JSESSIONID.那可能吗?如果有,怎么样?

谢谢

html gwt tomcat

3
推荐指数
1
解决办法
6511
查看次数