(本文档仅供参考)
现象一:
在同一个服务器上部署了两个应用,分部以不同的端口号区分,这时候在同一个浏览器同时访问着两个环境,发现会导致出现会话超时的现象,一直无法正常登陆使用系统。
现象举例说明:
如在浏览器上访问了http://10.10.202.17:18620/smartbi/vision/index.jsp,同时在这个浏览器另一个标签访问 http://10.10.202.17:18600/smartbi/vision/index.jsp ,然后会无法正常登陆使用系统:
现象二:
系统集成环境,有可能会在一个集成环境中同时传递多个报表,这时候如果没有有用的JSESSIONID 也会造成访问的时候出现会话混乱,导致系统报表访问会话超时的现象。
Smartbi的会话保持机制和其他应用一样都是遵循浏览器对于cookie持有机制的,浏览器cookie原理可以查看网上相关介绍文档 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies:
通俗的来说cookie就是一段文本,它存储在客户端(通常来说是浏览器)。你可以把cookie当作一个map,里边是键值对,每个键值对有 过期时间、域、路径、脚本可否访问等描述信息;描述信息存储在客户端,客户端请求时,默认会带上cookie的名称和值,不会带描述信息,通过http请求报文header中的cookie项进行传输;服务器响应时,可以设置cookie信息,就在http响应报文的header中Set-Cookie项。
因cookie区分域,而不区分端口,也就是说,同一个ip下的多个端口下的cookie是共享的!更确切的说,请求是会带上同域下所有端口的cookie,但是返回时会覆盖,因此如果在同一个浏览器同时访问相同IP不同端口号的应用,就会引发 会话混乱,导致系统无法正常使用。
对于浏览器cookie更详细的原理说明也可通过网上的文档进一步了解:https://blog.csdn.net/wangjun5159/article/details/52312737
第一:Cookie中的JSESSIONID 是浏览器请求服务器时,服务器生成返回给浏览器的会话ID,一个JSESSIONID对应一个会话。Smartbi是会话的使用方,会将一些报表信息、用户信息等放到会话当中,本身无法控制会话的生成和消费,会话的生成和消费是由服务器和浏览器决定的。
第二:在浏览器打开报表时,Smartbi会将报表的信息(例如:报表状态、当前选择的参数、转换规则等)和登录用户信息存储到对应的JSESSIONID所对应的会话中,下次用户再刷新报表时,Smartbi产品会根据当前的JSESSIONID找到原来对应的会话,然后在会话中找到原来的报表信息和用户信息,校验用户并刷新报表数据。
第三:当浏览器同时加载多个报表时,由于请求中的cookie中都没有带有JSESSIONID,此时服务器会生成多个不同的JSESSIONID给浏览器。而Smartbi对于同一个浏览器,只会保留最后一个会话的信息。所以当浏览器再次向Smartbi发起报表请求时,浏览器带过来的JSESSIONID是属于未被服务器保留的会话,则无法找到相关的报表信息和用户信息而提示报错。
分别在不同浏览器,或者同一个浏览器上,一个系统用浏览器直接访问效果,另一个系统用【打开新的无痕窗口】,这样的话,两个系统持有的cookie信息也是不一样的,不会被覆盖。
第三方系统,在同时打开多个openresource.jsp 页面,先触发smartbi静态页面,进行一次握手动作,静态页面URL是 http://ip:端口号/smartbi/vision/noop.jsp。触发方式有两种,第三方系统按实际情况选用:
(1)用隐藏iframe的方式(如把iframe的display设为none)打开这个noop.jsp 静态页面,监控页面加载完成后再执行同时打开多个openresource.jsp 页面的操作。
(2)如果第三方系统和Smartbi不存在跨域问题,可以用Ajax调用noop.jsp,请求返回200状态码后再执行同时打开多个openresource.jsp 页面的操作。