




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用Struts的Token机制解决表单的重复提交 Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,通过隐藏字段来保存,保存的形式如: input type=hidden name=org.apache.struts.taglib.html.TOKEN value=6aa35341f25184fd996c4c918255c3ae,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。在Action中的add方法中,我们需要将Token值明确的要求保存在页面中,只需增加一条语句:saveToken(request);,如下所示: public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)/前面的处理省略saveToken(request);return mapping.findForward(add);在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示:public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)if (isTokenValid(request, true) / 表单不是重复提交/这里是保存数据的代码 else /表单重复提交saveToken(request);/其它的处理代码2222222222222222222222222222222222222222222222222222222222222222222221。重复提交、重复刷新的场景重复提交、重复刷新都是来解决系统重复记录的问题。也就是说某个人在多次的提交某条记录(为什么?也许是闲了没有事情干的;最有可能是用户根本就不知道自己的提交结果是否已经执行了?!)。但出现了这样的问题并不见得就必须处理,要看你所开发的系统的类别而定。比如你接手的是某个资源管理系统,系统本身从需求的角度根本就不允许出现重复的记录,在这样需求的约束条件下,去执行重复的提交动作只会引发“业务级异常”的产生,根本就不可能执行成功也就无所谓避免不避免的问题了。2。防止后退的场景了解了重复刷新、重复提交的场景,我们来了解一下防止后退操作的原因是什么?比如你在开发某个投票系统,它有很多的步骤,并且这些步骤之间是有联系的,比如第一步会将某些信息发送给第二步,第二步缓存了这些信息,同时将自身的信息发送给了第三步。等等,如果此时用户处在第三步骤下,我们想象一下某个淘气用户的用户点击了后退按钮,此时屏幕出现了第二步骤的页面,他再次的修改或者再次的提交,进入到下一个步骤(也就是第三步骤),错误就会在此产生?!什么错误呢?最为典型的就是这样的操作直接导致了对于第一个步骤信息的丢失!(如果这样的信息是依靠Request存放的话,当然你可以存放在Session或者更大的上下文环境中,但这不是个好主意!关于信息存放的问题,下次在就这个问题详细的讨论)三。如何处理的问题当然很多的系统(比如订票系统从需求上本身是允许个人重复订票的)是必须要避免重复刷新、重复提交、以及防止后退的问题的,但即使是这样的问题,也要区分如何处理以及在哪里处理的(网上只是告诉你如何处理,但很少去区分在哪里处理的),显然处理的方式无非是客户端或者服务器端两种,而面对不同的位置处理的方式也是不同的,但有一点要事先声明:任何客户端(尤其是B/S端)的处理都是不可信任的,最好的也是最应该的是服务器端的处理方法。客户端处理:面对客户端我们可以使用Javascript脚本来解决,如下1。重复刷新、重复提交Ways One:设置一个变量,只允许提交一次。 var checkSubmit* = false; function checkSubmit() if (checkSubmit* = true) return false; checkSubmit* = true; return true; document.ondblclick = function docondblclick() window.event.returnValue = false; document.onclick = function doconclick() if (checkSubmit*) window.event.returnValue = false; Way Two : 将提交按钮或者image置为disable 2。防止用户后退这里的方法是千姿百态,有的是更改浏览器的历史纪录的,比如使用window.history.forward()方法;有的是“用新页面的URL替换当前的历史纪录,这样浏览历史记录中就只有一个页面,后退按钮永远不会变为可用。”比如使用javascript:location.replace(this.href); event.returnValue=false; 2.服务器端的处理(这里只说Struts框架的处理)利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。基本原理:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。if (isTokenValid(request, true) / your code here return mapping.findForward(success); else saveToken(request); return mapping.findForward(submitagain); Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。1. /验证事务控制令牌,会自动根据session中标识生成一个隐含input代表令牌,防止两次提交2. 在action中:/ if (!isTokenValid(request) errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(error.transaction.token); resetToken(request); /删除session中的令牌 3. action有这样的一个方法生成令牌protected String generateToken(HttpServletRequest request) HttpSession session = request.getSession(); try byte id = session.getId().getBytes(); byte now = new Long(System.currentTimeMillis().toString().getBytes(); MessageDigest md = MessageDigest.getInstance(MD5); md.update(id); md.update(now); return (toHex(md.digest(); catch (IllegalStateException e) return (null); catch (NoSuchAlgorithmException e) return (null); 总结对于重复提交、重复刷新、防止后退等等都是属于系统为避免重复记录而需要解决的问题,在客户端去处理需要针对每一种的可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程项目临时电力设施建设方案
- 建筑设备安装施工方案
- 2025年普法考试题库及答案
- 2025年院感防控知识竞赛试题及答案
- 2025-2030中国电动吸奶器行业销售动态及消费趋势预测报告
- 机械设备购销合同
- 难点解析华东师大版7年级下册期末试题含答案详解(A卷)
- 难点解析-安徽省桐城市七年级上册有理数及其运算专项测评练习题(详解)
- 凉山州人力资源和社会保障局“千名英才·智汇凉山”行动2025年第一批引才(609人)考前自测高频考点模拟试题及答案详解1套
- 临床执业医师考前冲刺测试卷附答案详解(黄金题型)
- 2025年云南省高校大学《辅导员》招聘考试题库及答案
- 消费品市场2025年消费者对绿色包装认知及需求调研可行性研究报告
- 台球厅消防知识培训课件
- 充电桩运维服务协议
- 2025至2030中国防砸安全鞋行业运营态势与投资前景调查研究报告
- 2025年医疗器械仓库管理培训试题及答案
- 2024年湖南省古丈县事业单位公开招聘工作人员考试题含答案
- 卵巢性索间质肿瘤课件
- 2025甘肃行政执法资格考试模拟卷及答案(题型)
- 2025-2026年秋季第一学期学校德育工作安排表:德润心田、智启未来、行塑栋梁
- 成人零基础英语教学课件
评论
0/150
提交评论