用Struts的Token机制办理表单反复提交[Java编程]
本文“用Struts的Token机制办理表单反复提交[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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);
//别的的处理代码
}
}
其实利用起来很简单,举个最简单、最需求利用这个的例子:
普通掌握反复提交主如果用在对数据库操作的掌握上,比方插入、更新、删除等,由于更新、删除普通都是通过id来操作(比方:updateXXXById, removeXXXById),所以这类操作掌握的意义不是很大(不解除个表现象),反复提交的掌握也就主如果在插入时的掌握了.
先说一下,我们目前所做项目的情形:
目前的项目是用Struts+Spring+Ibatis,页面用jstl,Struts复杂View层,Spring在Service层供应事件掌握,Ibatis是用来替换JDBC,全部页面的拜候都不是直接拜候jsp,而是拜候Structs的Action,再由Action来Forward到一个Jsp,全部针对数据库的操作,比方取数据或改正数据,都是在Action里面完成,全部的Action普通都担当BaseDispatchAction,这个是自己成立的类,目的是为全部的Action做一些统一的掌握,在Struts层,关于一个功效,我们普通分为两个Action,一个Action里的功效是不需求调用Struts的考证功效的(常见的办法名称有add,edit,remove,view,list),另一个是需求调用Struts的考证功效的(常见的办法名称有insert,update).
就拿论坛发贴来说吧,论坛发贴首先需求跳转到一个页面,你可以填写帖子的主题和内容,填写完后,单击“提交”,贴子就发表了,所以这里经过两个步骤:
1、转到一个新增的页面,在Action里我们普通称为add,比方:
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//这一句是输出调试信息,表示代码履行到这一段了
log.debug(":: action - subject add");
//your code here
//这里保存Token值
saveToken(request);
//跳转到add页面,在Structs-config.xml里面定义,比方,跳转到subjectAdd.jsp
return mapping.findForward("add");
}
以上是“用Struts的Token机制办理表单反复提交[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |