我有一个基于J2EE / JSF的网络应用程序。 它由表单输入,文本显示和通过Google Visualization API和自定义servlet数据源呈现的可视化组成。
页面呈现在页面的<iframe/>
中,我最多可以部分控制。
在Chrome,Firefox上,该应用程序运行良好。它们接受JSF生成的会话cookie,并在每次请求时将会话ID返回给服务器。 在IE上,我们不得不进行一些调整,但总而言之,它也可以起作用。
在Safari(5.1.2 / Windows XP)上,会话ID作为非标准URL参数(;jsessionid=...
)发送。因此,对servlet数据源的查询不包含会话ID,并为每个对数据源的请求创建一个新会话。
这导致可视化停留在初始状态。
我怀疑浏览器的不同JavaScript引擎的原因,但这种怀疑几乎没用。
我可以以某种方式让Safari将会话ID添加到所有请求中吗?更好的是,我能不能以某种方式将cookie用于所有请求?
更新:我尝试将会话ID附加到Google的“查询”对象执行的调用中,但失败了。 当像这样调用时
new google.visualization.Query('chartdata?randomBitToBypassCaching='+random+";jsessionid="+jsessionid);
请求的URL是
http://localhost:8083/myapp/chartdata?randomBitToBypassCaching=1327312516149;jsessionid=9fdb20a75d30f000c063317997b5&tqx=reqId%3A0
请注意,查询会在网址中添加tqx
- 参数,这会让我尝试传输ID。
Update 2 :在URL中传输jsessionid的推荐方法是在参数之前添加它。
答案 0 :(得分:0)
最后,我将会话ID作为URL参数进行了转移,并实现了一个Servlet过滤器,该过滤器使用标准符号;jsessionid=...?...
重定向请求
不幸的是,只需将会话ID附加到查询字符串 - 之前任何其他参数 - 都不起作用:
new google.visualization.Query('chartdata;jsessionid="+jsessionid?randomBitToBypassCaching='+random+");