日期:2014-05-16 浏览次数:20662 次
使用struts有一个很奇怪的事情,就是你不知道在什么时候,就放进来一个bug,重复地提交,而且渗透到好几个方法,甚至整个action都会被污染。像打补丁似的,struts本身可以有一个可以用来防止重复提交的拦截器:<interceptor-ref name="token"/>
<action name="*action" class="UserAction" method="{1}"> <interceptor-ref name="token"/> <interceptor-ref name="defaultStack" /> </action>
<frameset rows="64,600" frameborder="NO" border="0" framespacing="0" > <frame src="top.jsp" noresize="noresize" frameborder="0" name="topFrame" scrolling="no" marginwidth="0" marginheight="0" target="main" /> <frameset cols="20%,80%" rows="600,*" id="contentFrame" border="1" > <frame src="left.jsp" name="leftFrame" noresize="noresize" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" target="main" /> <frame src="right.jsp" name="main" marginwidth="0" marginheight="0" frameborder="0" scrolling="auto" target="_self" onload="rightOnload()" /> </frameset> </frameset> <noframes> <body></body> </noframes>
1、首先左边页面不提交本身,要怎样传token?
2、左边frame点击之后,右边加载的frame不一定每一个frame都有token,如何确保token是最新的,跟session中是匹配的?
实验了很多次之后,把方法在这里贴出来,分享一下。
一开始的想法几乎是对的,就是在右边的frame页面加载的时候,在onload事件里,把token值保存到左边的静态页面上面,再在左边的链接点击时,在其onclick事件上,拼装出带token的url来。
//右边的onload事件 //每一次刷新当前页面时,把左边的页面的token更新 function onloadEvent(){ //拿到左边的frame的document var leftDoc = self.parent.frames["leftFrame"].document; var leftToken = leftDoc.getElementsByName("struts.token").item(0).value; var rightToken = document.getElementsByName("struts.token").item(0).value; leftToken = rightToken; }
//左边的onclick事件 //a标签点击事件 function manageClick2(){ //拿到右边的document var documentObj = self.parent.frames["main"].document; //通过document拿到"struts.token"的值 var tokenObj = documentObj.getElementsByName("struts.token").item(0); //null表示当前右边frame没有token标签,没有token标签,就拿到自己本身 //的token值,因为右边加载的时候,会把左边的token更新 if(tokenObj == null) { var tokenValue = document.getElementsByName("struts.token").item(0).value; document.getElementById("userManage").href = "findAllaction.action?struts.token.name=struts.token&struts.token="+tokenValue; }else{//右边存在token标签 //拿到右边的frame的token值,并把它更新到本身的token值 var documentObj = self.parent.frames["main"].document; var tokenValue = documentObj.getElementsByName("struts.token").item(0).value; var tokenName = documentObj.getElementsByName("struts.token.name").item(0).value; document.getElementById("userManage").href = "findAllaction.action?struts.token.name="+tokenName+"&struts.token="+tokenValue; } }
<!-- jsp中的源码 --> <form method="post" name="hiddenForm"> <input type="hidden" id="hiddenTest" value="123456Test" > <s:token></s:token> </form>
<!-- 浏览器端看到的源码 --> <form method="post" name="hiddenForm"> <input type="