ITKeyword,专注技术干货聚合推荐

注册 | 登录

利用Token防止重复提交(Struts框架)

love12chen 分享于 2010-12-21

推荐:struts利用Token(令牌)防止用户重复提交(转载)

struts利用Token(令牌)防止用户重复提交(原创)  在我们的开发中经常遇到需要防止用户重复提交的情况,如果你用了struts,恭喜你,因为struts已经给你做好了

2020腾讯云共同战“疫”,助力行业复工(优惠前所未有!),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1053

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

利用Token防止重复提交(Struts框架)

 

如果用户对一个html表单多次提交,web应用应该能够判断用户的重复提交行为,并作出相应的处理。 

 

最常见的是新增一条数据,用户已经提交表单并且服务器端已经完成新增成功。此时用户可能有两个误

 

操作: 

1.用户通过浏览器的后退功能,返回到录入页面,重复提交(此时浏览器提供回退功能基本上是个邪恶

 

行为) 

2.刷新该页面(因为新增成功的提示页面通常是通过请求转发(forward)过来的,所以此操作实际效果通

 

常等同于1) 

 

这样造成的可能结果有: 

1.若程序级别和数据库级别限制了重复记录,会提示类似于“xxx字段已存在,请修改后重新保存”的信

 

息 

2.若没有此限制,服务器端会再插入一条数据,而这通常不是用户想要的 

 

误操作2和可能结果2的结合就达成了与用户意图相背的结果:服务器端不停地在增加重复记录,用户认

 

为自己只不过是刷新该提示信息页面。 

 

通用的解决思路是: 

用户请求录入页面,这个与服务器建立的一次连接过程中,在服务器端①【生成一个session标识,同时

 

返回到客户端一个与此匹配的hidden域】。用户提交了此页面,服务器端首先②【判断此hidden域与

 

session标识是否匹配】,若不匹配,终止保存操作,提示同一表单不能提交两次,同时①【新建一个

 

session标识和hidden域】,返回录入页面;若匹配,执行插入保存操作,同时③【清空(重置reset)

 

session标识】。 

 

Struts正在基于这样的思路在org.apache.struts.action.Action类中提供了内置支持方法: 

java代码: 

 

protected void saveToken(HttpServletRequest request) 配合标签对应于① 

protected boolean isTokenValid(HttpServletRequest request) 对应于② 

protected void resetToken(HttpServletRequest request) 对应于③

 

这样我们在写程序的时候,结合Struts的html标签,只要 

1.在forward到insert.jsp页面前加一个action执行saveToken(request)操作,或干脆在insert.jsp中写 

2.保存前加个判断操作isTokenValid(request) 

推荐:Struts2防止表单重复提交(源代码)

struts配置文件:struts.xml <xml version="1.0" encoding="UTF-8" > <!DOCTYPE struts PUBLIC     "-//Apache Software Foundation//DTD Struts Configuratio

3.若isTokenValid(request)返回false,执行saveToken(request)操作,返回错误提示页面;true则执行

 

resetToken(request)操作,然后进行实际的保存操作

 

我的代码

 

 

// 进入创建前的Action

public final class EnterNewProjectPageAction extends Action {

        public ActionForward execute(ActionMapping mapping, ActionForm form,

                        HttpServletRequest request, HttpServletResponse response)

                        throws Exception {        

 

                saveToken(request);

 

                return (mapping.findForward("createproject_jsp"));

        }

}

 

// 创建Action

public final class CreateProjectAction extends Action {

        public ActionForward execute(ActionMapping mapping, ActionForm form,

                        HttpServletRequest request, HttpServletResponse response)

                        throws Exception {        

 

 

                if(isTokenValid(request)){

                        resetToken(request);

 

                        CreateProjectForm createProjectForm=(CreateProjectForm)form;        

                        Project newProject=createProjectForm.getProject();

 

                        newProject.setCreateTime(Util.getCurrTime());

 

                        ProjectService.create(newProject);        

 

                }

                else{

                        saveToken(request);

                        System.out.println("重复提交");

                }                

 

                ProjectUtil.setupPages(0,request);

                return (mapping.findForward("projects_jsp"));

        }

}

推荐:struts2防止表单重复提交

1.用servlet&jsp防止表单重复提交的思路: 产生一个随机值,把这个值放在session中(例如:token=xxxxx),然后把这个值也包含在input.jsp的表单中(type=hidden

利用Token防止重复提交(Struts框架)   如果用户对一个html表单多次提交,web应用应该能够判断用户的重复提交行为,并作出相应的处理。    最常见的是新增一条数据,用户已经提交表单并且服务器

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。