一次刷新重复提交问题及其引入的新问题的解决过程记录
1. 问题描述
用户登陆后,刷新页面,IE提示重复提交,需要用户做出选择,影响用户体验.
2. 问题分析.
登陆页面是一个jsp,form中使用一个loginAction.action提交登陆.提交后在struts中
dispatch到主页面,即index.jsp,此时浏览器地址栏显示地址是用于登陆的action,
即: http://ip:port/loginAction.action这样的格式.
这个action地址就是上面登陆页面form的action,这样一按F5刷新,
造成重复提交(即,重复登陆).
3. 问题解决
登陆成功,将用户ID压入session后,让struts的action dispatch到一个临时的jsp,
这个jsp打开后,配置header的META,自动刷新到index.jsp页面.
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=<%=request.getContextPath()%>/index.jsp">
这样登陆后,浏览器中显示http://ip:port/index.jsp.
这样刷新时,就不会产生重复提交问题.
4. 引入新问题
上面的http://ip:port/index.jsp页面刷新后,发现又跳到登陆界面了.
跟踪发现,页面一刷新,登陆时压入session的用户id变成null,
导致用户重复处于未登陆状态. 就是刷新导致session丢失.
google发现,IE7中,当刷新一个带有iframe的页面时(index.jsp确实有一个frameset,包括leftFrame和mainFrame),
会导致session丢失.
很不幸,虽然测试使用的浏览器是IE8,当时也以为是这个刷新问题,折腾了不少时间,无果.
后来,无意跟踪过滤器代码发现,每次刷新或者关闭页面时,都会请求一个logout.action.
logout.action这个logout专门注销session.坑爹啊.....
检查index.jsp代码,发现注册了window.onbeforeunload事件,在这个事件中,请求logout.action.
于是导致,页面一刷新或者关闭页面所在的浏览器选项卡,或者直接关闭浏览器,
都会触发这个onbeforeunload事件,然后用户就logout了.
配置这个onbeforeunload事件,是因为,一个用户不能在不同的地方同时登陆系统.
这样,当一个用户用一个账号登陆时,这个账号就不能在别处登陆.这样就要求一旦用户从一个地方退出登陆,
或者关闭浏览器就要实现自动注销.否则,一个用户已经关闭浏览器退出登陆了,
该账号在session过期时间之内还是不能在别的地方登陆.于是注册onbeforeunload事件,当用了关闭浏览器,
就会自动登出.
但是注册onbeforeunload事件,在刷新时也会触发.
于是,产生了新问题,不能在onbeforeunload事件中让用户退出登陆,而且当用户长时间不操作,或者关闭
浏览器后,用户能自动退出登陆.因为注销session后,用户就失效,这跟让session过期是一样的.
于是想到了解决方案.
5. 引入问题解决
在index.jsp页面设置一个session超时时间sessionTimeOut,设置为10分钟.
然后启动一个定时器(setInterval),每10秒钟执行一次,让sessionTimeOut减10.
同时,在这个定时器(setInterval)中,检查sessionTimeOut,假如sessionTimeOut>0,
就发送ajax请求(心跳),每次将当前session过期时间设置为15秒以后.
另外,在index.jsp的主页面和两个frame页面都注册document的mousemove事件,只要一检测
到鼠标移动(说明在操作),就把sessionTimeOut重新设置为初始值10分钟.
因为,两个frame中的页面随时都可能变化,这里就需要在设置一个定时器,每隔一秒钟给两个frame
中的页面的document注册mousemove事件,以重设sessionTimeOut.
这样,当长期不操作系统,sessionTimeOut减小为0后,停止发送ajax请求(心跳),则15秒后,session过期,
导致用户退出登陆.
index.jsp中js代码(使用jquery)
var SESSION_TIME = 10 * 60 * 1000; //十分钟
var setChangeIterval = 1000;
var setHeartBeatInterval = 10 * 1000; // 不能配置大于15秒,后台写死了
var sessionTimeOut = SESSION_TIME; //页面没有做操作时间的 超过10分钟 + 15秒(最多),则session过期,需要重新登陆
//鼠标移动事件
function docMouseMoveFunc()
{
//鼠标不动时,该变量每隔10秒钟减少10,当该变量变成0后,页面不发送心跳,这样当前session最多在15秒后过期.
//同时,给页面绑定mouse事件,鼠标移动,改变量值恢复为初始值.
sessionTimeOut = SESSION_TIME;
}
//心跳函数,每10秒钟执行一次,
function hearBeat()
{
if(sessionTimeOut > 0)
{
var url = "<%=request.getContextPath()%>/heartBeat.action";
$.ajax({
url:url,
cache: false,
success:function(data, textStatus)
{
if(data.heartBeatDone != 1) //说明后台报错,则不再发送心跳请求
{
sessionTimeOut = 0;
}
},
type:'post',
async:true,
dataType:'json',
error:function(XMLHttpRequest, textStatus, errorThrown)
{
}
});
sessionTimeOut = sessionTimeOut - 10 * 1000;
}
}
//给框架页面绑定事件,为防止框架中页面改变,该函数每隔一秒执行一次
function frameDocChange()
{
$(frames.leftFrame.document).mousemove(docMouseMoveFunc);
$(frames.mainFrame.document).mousemove(docMouseMoveFunc);
}
//给框架页面绑定事件,为防止框架中页面改变,该函数每隔一秒执行一次
setInterval('frameDocChange()',setChangeIterval);
//每隔10秒钟执行一次心跳,将当前session过期时间设置为15秒之后
setInterval('hearBeat()',setHeartBeatInterval);
//
$( document ).mousemove(docMouseMoveFunc);
//页面加载完成后执行一次心跳
$(document).ready(
function()
{
hearBeat();
sessionTimeOut = SESSION_TIME; //恢复超时计时
});
-------------------------------
action配置:
<action name="heartBeat" class="xxx.HeartBeatAction" method="heartBeat">
<result name="sucess">/heartBeatResult.jsp</result>
</action>
heartBeat方法:
public String heartBeat()
{
heartBeatDone = "1";
try
{
ctx = ActionContext.getContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession httpSession = request.getSession();
httpSession.setMaxInactiveInterval(15); //前台每隔10秒将当前session过期时间设置为15秒以后
System.out.println(new Date());
}
catch (Exception e)
{
heartBeatDone = "0";
}
return "sucess";
}
heartBeatResult.jsp代码:
<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
{ heartBeatDone:${heartBeatDone}}
相关推荐
- **WebLogic访问XML问题**:提供了在WebLogic服务器环境中访问XML文件时可能遇到的问题及其解决办法。 - **如何自定义DWZ分页参数**:介绍了如何根据项目需求调整分页功能。 - **如何关闭loading**:指导如何控制...
- **调试技巧**:提供一些基本的调试技巧,帮助开发者快速定位并解决问题。 #### 测试Nerd Dinner应用程序 - **手动测试**:指导如何手动测试应用程序的功能,确保基本功能正常。 - **自动化测试**:介绍如何编写...
MariaDB 致力于保持向后兼容性,并引入了诸多新特性来提升性能。 **选择合适的硬件** - **磁盘类型** - **SATA 磁性驱动器**:适合低预算项目,读写速度较慢。 - **SAS 磁性驱动器**:提供更快的速度和更好的...
79 <br>0115 如何判断是否为数字 79 <br>0116 如何在字符串中查找指定字符 79 <br>0117 如何在字符串中用一子串替换另一子串 80 <br>0118 将新字符串添加到已有字符串中 80 <br>0119 如何在...
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
内容概要:本文档提供了关于数据分析全面的知识介绍与实战资源链接。首先,在数据分析的基础教程部分讲述了使用Python以及R两种语言来进行实际的数据分析工作所需具备的各项基本技能。其次,进阶教程涵盖从机器学习到深度学习的概念及其Python具体应用场景。接着,在工具有效利用层面介绍了多种热门库与平台的作用特点。在项目实践中,列举了四个实战案例:Titanic幸存者预测、房价预测、社交媒体情感倾向分析以及市场顾客购买模式研究,每个项目都有详细的技术流程指引。另外列出多个外部网站资源供进一步提升学习。 适用人群:本文主要面向有志于从事数据挖掘工作的学生和技术爱好者,同时也可辅助在职人士自我能力进阶。无论是在学术科研还是实际业务需求环境中都值得研读。 使用场景及目标:学习者将能够获取到系统的理论知识体系,熟悉业界主流软件包的功能优势,掌握具体业务问题解决方案路径,提高自身的综合技术素质,从而为个人职业规划增添竞争力。 其他说明:文档里推荐了不少高质量参考资料和实用线上学习社区,能有效补充专业知识空白并促进社交协作交流。
从埃安泰国工厂竣工看中国车企加快海外建厂步伐.pptx
复现改进的L-SHADE差分进化算法求解最优化问题详解:附MATLAB源码与测试函数集,复现改进的L-SHADE差分进化算法求解最优化问题详解:MATLAB源码与测试集全攻略,复现改进的L-SHADE差分进化算法求最优化问题 对配套文献所提出的改进的L-SHADE差分进化算法求解最优化问题的的复现,提供完整MATLAB源代码和测试函数集,到手可运行,运行效果如图2所示。 代码所用测试函数集与文献相同:对CEC2014最优化测试函数集中的全部30个函数进行了测试验证,运行结果与文献一致。 ,复现; 改进的L-SHADE差分进化算法; 最优化问题求解; MATLAB源代码; 测试函数集; CEC2014最优化测试函数集,复现改进L-SHADE算法:最优化问题的MATLAB求解与验证
可选择参考电压与输出电压 可选择电阻精度以及输出电压误差值
西门子博途三部十层电梯程序案例解析:基于Wincc RT Professional V14及更高版本的应用探索,西门子博途三部十层电梯程序案例解析:基于Wincc RT Professional画面与V14及以上版本技术参考,西门子1200博途三部十层电梯程序案例,加Wincc RT Professional画面三部十层电梯程序,版本V14及以上。 程序仅限于参考资料使用。 ,西门子;1200博途;三部十层电梯程序案例;Wincc RT Professional;V14以上程序版本。,西门子V14+博途三部十层电梯程序案例:Wincc RT Pro专业画面技术解析
2023政务大数据解决方案.pptx
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
内容概要:本文介绍了基于Java的学业跟踪评价系统的详细设计与实现,涵盖系统的多维度数据整合与评价、智能化学习建议、数据可视化和实时反馈等方面。系统通过收集课堂表现、作业成绩、考试成绩等多源数据,对学生的学业表现进行全面跟踪和评价,提供可视化反馈以及个性化的学习建议,促进家校互动,助力学生全面素质提升和发展。 适合人群:具备一定Java编程经验的研究者和开发者,特别是从事教育信息化领域的从业人员和技术爱好者。 使用场景及目标:该系统主要用于K12教育阶段、高等教育以及其他涉及教育培训的场景。其目的是提高教育管理效率、推进教育数字化转型和个人化教育实施。 其他说明:该文档详细介绍了系统的设计思路、功能模块和技术细节,并提供了完整的程序代码以及GUI设计说明。对于希望深入了解或实际部署学业跟踪评价系统的机构非常有参考价值。文中强调技术创新与实践经验相结合,突出了实用性和前瞻性特点。
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
erlang安装包,rabbmit安装环境
linux 下的oracle数据库的开机启动脚本,将里面的/home/oracle/app/oracle/product/11.2.0/dbhome_1 都改成你的oracle数据库的路径。在root用户下chmod +x 添加执行权限,然后./oracle_setup.sh 执行即可。
基于目标级联分析法的多微网主动配电系统自治优化经济调度算法实现与初级应用,基于目标级联分析法的多微网主动配电系统自治优化经济调度算法实践:初级拉格朗日算法应用,GAMS代码:基于目标级联分析法的多微网主动配电系统自治优化经济调度 该代码并非完全复现该文献,而是参照文献 《基于目标级联分析法的多微网主动配电系统自治优化经济调度》 的目标级联分析法(ATC)的算法部分,采用初级的拉格朗日算法,主网与配网部分模型较为简化。 代码结构完整,注释详细,可读性较强,可以在此基础上进行修改或者移植。 适用于初学者学习ATC模型 ,GAMS代码;目标级联分析法(ATC);微网主动配电系统;自治优化经济调度;拉格朗日算法;主网与配网模型简化;代码结构完整;注释详细;可读性强;初学者学习ATC模型。,基于ATC算法的GAMS多微网经济调度优化代码:简化版学习指南
基于ISODATA改进算法的负荷场景曲线聚类——适用于风光场景生成的高效算法创新,基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成,包含K-means等多种聚类方法与效果评价),基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成) 摘要:代码主要做的是一种基于改进ISODATA算法的负荷场景曲线聚类,代码中,主要做了四种聚类算法,包括基础的K-means算法、ISODATA算法、L-ISODATA算法以及K-L-ISODATA算法,并且包含了对聚类场景以及聚类效果的评价,通过DBI的计算值综合对比评价不同方法的聚类效果,程序实现效果非常好,适合对于算法创新有需求的人,且也包含基础的k-means算法,用来学习也非常棒 另外,此代码同样适用于风光场景生成,自己准备好风光场景数据即可 代码非常精品,有部分注释; ,核心关键词: 1. 基于ISODATA改进算法 2. 负荷场景曲线聚类 3. K-means算法 4. 聚类场景评价 5. 聚类效果评价 6. DBI计算值 7. 算法创新需求 8. 风光场景生成 以上关键词用分号分隔为: 1. 基于ISO
xPack qemu arm 是一款高性能且跨平台的 ARM 架构虚拟机
莫理莉+AI+为新型能源系统赋能-技术与建筑建筑供配电论坛琶洲.pptx