转自:http://blog.csdn.net/lfsf802/article/details/8688536
今天介绍struts中如果防止页面重复提交。其实关于防止重复提交的方法有很多种,如果提交之后把按钮变为不可用,利用时间戳来判断两次提交的值是否为一样等。在struts中有令牌这个概念,我是这次面试问题的根本所在,这个问题的提出其实就是想知道我在用struts的时候是不是会用struts提供的令牌来解决这个方式页面重复提交的问题。
所以在这里总结一下struts如果利用令牌来解决页面重复提交的问题的。这篇先介绍struts1框架的实现。
1、 搭建项目(省略):主要是搭建struts1框架的项目
2、 创建需要的类:需要一个action和一个actionForm(具体的代码可以用下面的连接进行下载)
3、 创建需要的页面:因为一般防止重复提交的问题是在添加中才遇到的,所以需要的页面有索引页面,添加页面,添加成功页面,添加失败页面,错误页面(这个是在重复提交之后跳转的页面)
4、 配置struts-config.xml和web.xml文件
5、 运行、测试。
具体程序源代码下载地址:http://download.csdn.net/detail/lfsf802/5153872
具体要说的就是Action代码:
- public ActionForward add(ActionMapping mapping, ActionForm form,
- HttpServletRequestrequest, HttpServletResponse response)
- throws Exception {
- this.saveToken(request);
- return mapping.findForward("showadd");
- }
- public ActionForwardinsert(ActionMapping mapping, ActionForm form,
- HttpServletRequestrequest, HttpServletResponse response)
- throws Exception {
- if (this.isTokenValid(request, true)) {
- UserFormuserForm=(UserForm)form;
- System.out.println(userForm.getUsername()+"---"+userForm.getPassword());
- return mapping.findForward("addSuccess");
- }else{
- this.saveToken(request);
- return mapping.findForward("error");
- }
- }
这里面是从index页面调用add方法来显示添加页面,在这个过程中调用了this.saveToken(request);方法来产生令牌的,也就是在添加页面中添加一个隐含域,并且把这个隐含域的属性和值放到session中,
当添加页面点击添加的时候调用insert方法,这时候this.isTokenValid(request, true)就会判断从页面传来的令牌和session中的令牌是否一样,当然因为是第一次,所以会相等,这样就会清空session的令牌,之后跳转到添加成功或者添加失败的页面。
然而当我们在回退在此添加,这时候session的令牌没有了,所以令牌值会不相同,这时候就会跳到error页面,提示不能重复提交。
在这里需要有一点是注意的,添加页面必须使用struts1的标签来进行书写,也就是用<html:text>等标签,否则它不会自动的创建令牌的。
以上就是struts1利用令牌解决页面重复提交的问题,下一篇博客介绍struts2利用令牌解决重复提交的问题,敬请关注!