【问题标题】:J2EE -- Handling HttpSession session timouts while serving flash contentJ2EE——在提供 Flash 内容时处理 HttpSession 会话超时
【发布时间】:2010-02-18 16:14:47
【问题描述】:
在提供基于 Flash 的培训材料时,用户会周期性地遇到 HttpSession 会话超时。目前不活动超时设置为默认值(30 分钟)。
问题:
对于请求训练 Flash 视频以防止超时的任何用户,尝试增加 MaxInactiveInterval 是否是个好主意?
如果 HttpSession 与查看培训内容相关联,那么更好的方法是使用 servlet 生命周期侦听器重新激活 HttpSession 吗? -- 这可以更精确地控制 HttpSession 对象何时超时。
实际上只有一小部分用户会在任何时候查看此材料,这样做是否应该考虑性能损失?
【问题讨论】:
标签:
java
servlets
session-timeout
【解决方案1】:
在后台触发 ajax 投票。
这是一个SSCCE,在jQuery 的帮助下。只需复制'n'粘贴'n'运行它(并更改 flash 对象以适合您的实际代码)。
<!doctype html>
<html lang="en">
<head>
<title>SO question 2290101</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$(document).ready(function() {
setInterval(function() {
$.get('poll');
}, ${(pageContext.session.maxInactiveInterval - 10) * 1000});
});
</script>
</head>
<body>
<object type="application/x-shockwave-flash" ... >
...
</object>
</body>
</html>
这里${pageContext.session.maxInactiveInterval} 返回会话尚未存在的剩余秒数(并且被缩短了一点 - 只是为了及时轮询 - 并转换为毫秒,以便它适合 setInterval() 的期望)。 $.get('poll') 应该调用映射到 /poll 的 url-pattern 的 servlet,并且在 doGet() 方法中基本上包含以下行。
request.getSession(); // Keep session alive.
就是这样。
【解决方案2】:
Flash 视频是否嵌入在 HTML 页面中?如果是这样,也许您可以在页面上进行 AJAX 调用,定期向服务器发送“心跳”以保持会话处于活动状态。