此外,正在设置的对象是否必须是线程安全的,以保证我们知道会话中存储的对象的状态是什么.
此外,我正在网上阅读一些建议使用:
synchronized(session) {
session.setAttribute("abc", "abc");
}
Run Code Online (Sandbox Code Playgroud)
这是一个有效的建议吗?
我发送一个$.getJSON(HTTP GET)请求两次(使用不同的数据),一个接一个(假设我们有request1和request2).我可以在FF和Chrome的开发者工具中看到我有相同的cookie:JSESSIONID=FD0D502635EEB67E3D36203E26CBB59A标题字段.
在服务器端,我尝试获取会话:
HttpSession session = request.getSession();
boolean isSessionNew = session.isNew();
String sessionId = session.getId();
String cookieFromRequestHeader = request.getHeader("cookie");
Run Code Online (Sandbox Code Playgroud)
如果我为两个请求打印这些变量,请求1
:
isSessionNew:true
cookieFromRequestHeader:JSESSIONID = FD0D502635EEB67E3D36203E26CBB59A
session.getId():9212B14094AB92D0F7F10EE21F593E52
请求2:
isSessionNew:true
cookieFromRequestHeader:JSESSIONID = FD0D502635EEB67E3D36203E26CBB59A
session.getId():E8734E413FA3D3FEBD4E38A7BF27BA58
如您所见,服务器在a上为request2清楚地创建了一个新会话request.getSession().但为什么会这样呢?它理论上应该是同步的,并为您提供与第一个请求(首先达到此代码)创建的会话相同的会话.现在,为了确保会话创建已同步,我执行了以下操作:
@Autowired
private ServletContext servletContext;
...
synchronized (servletContext) {
HttpSession session = request.getSession();
boolean isSessionNew = session.isNew();
String sessionId = session.getId();
String cookieFromRequestHeader = request.getHeader("cookie");
}
Run Code Online (Sandbox Code Playgroud)
我得到了同样的结果.
如果我再次发送相同的请求(比如request1'和request2'),我得到,
request1':
isSessionNew:false
cookieFromRequestHeader:JSESSIONID = E8734E413FA3D3FEBD4E38A7BF27BA58 session.getId():E8734E413FA3D3FEBD4E38A7BF27BA58
请求2' :
isSessionNew:false
cookieFromRequestHeader:JSESSIONID = E8734E413FA3D3FEBD4E38A7BF27BA58
session.getId():E8734E413FA3D3FEBD4E38A7BF27BA58 …
我想HttpSession通过JSESSIONID 获取Java .可能吗?如果有,怎么样?
我想知道Spring框架的HttpSessionMutexListener监听器是否仍然与今天的应用服务器/ Web容器(比如2.5 + servlet规范服务器,如Tomcat 6或Tomcat 7)相关,用于在集群环境中锁定会话对象(即在不同的JVM之间) ,或者他们只解决2.3(或以前)servlet规范容器的集群环境中的并发问题,现在它是不必要的?
java ×3
httpsession ×2
servlets ×2
spring ×2
concurrency ×1
http-get ×1
jquery ×1
session ×1
synchronized ×1