当前位置:编程学习 > JSP >>

Liferay研究之二十:如何防止连续重复提交


一般的解决连续重复提交的办法有以下几种。

方法一、提交后 禁用提交按钮(大部分人都是这样做的)
方法二、使用Session, session里面加令牌,第一次设置一个值,以后请求先与这个令牌进行比较;
方法三、数据处理成功马上Redirect到另外一个页面

Liferay中前台使用了客户端脚本(可能是JQuery,没仔细研究)、Session,后台采用同步、多线程等来解决这个问题。服务端解决的具体思路如下:

在Session中放一个DoubleClickControlor的实例,然后对这个实例进行同步,来判断是否重复提交请求。
如果重复提交请求,则判断哪个是firstRequest,哪个不是,不是的话就以DoubleClickControlor的实例为同步依据,进入一个等待状态,直到firstRequest执行完,调用notifyAll方法,激活第二次请求。
在DoubleClickFilter中,controller.control(httpReq, httpRes, chain);第二次请求会没有任何异常结束,这样会执行ok = true; 进而在控制台打印出阻止一次重复提交等信息。

另外,补充温习一个FilterChain的知识点。
向服务器发起一个请求时,在访问所请求的资源之前,会先通过Filter Mapping配置来匹配有哪些Filter需要被执行。所有的Filter根据filter-mapping定义的顺序形成一个FilterChain,依次进行调用。

这个调用有点类似于递归,在调用到chain.doFilter()时,程序执行主线会跳转到下一个Filter的doFilter方法中,直到最后一个Filter, 最后一个filter执行chain.doFilter时不执行操作,也不会跳转到其他Filter,会将chain.doFilter之后的代码执行完,退出doFilter方法,然后执行倒数第二个Filter的chain.doFilter后面的代码,依此类推。

Liferay中通过system.properties来设定开启或关闭哪个Filter.

 

补充:Jsp教程,Java基础 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,