表单重复提交问题

问题:

表单提交页面,刷新后,出现数据重复提交问题

原因:

1.保存数据后的跳转问题


@Action(value = "accountUpdate", results = { @Result(name = "success", type = ResultTypeConstants.VELOCITY , location = "accountView.vm") })



解释:进入编辑页面,提交数据到 accountUpdate.do ,数据编辑或添加完成后,跳转到accountView.vm,但浏览器上的URL依然是 */*/accoutUpdate.do,故刷新浏览器会出现重复提交问题

2.数据保存编辑操作的程序本身以及业务逻辑问题

(1)业务逻辑:账户由于需要审核,故分两张表存放相同的数据,主表与备份表,

原理:数据只要存放在一张表中,另外一张表起审核操作时,数据数据对照功能

出现问题的原因:对主从表的使用,在新旧版系统的不一致,即

旧版:数据存放主表,从表起对照作用

新版:数据存放从表,主表起对照作用

(2)程序本身

由于业务逻辑的变更,而程序又由于长时间没有进行维护,所以对于重复提交这种问题,没有

做出相应的判断,即可以通过查询判断该商户编号是否已经有关联的账信息来判断

解决:

1.处理数据更新的ACTION的跳转改为REDICT重定向

@Action(value = "accountUpdate", results = { @Result(name = "success", type = ResultTypeConstants.REDIRECT , location = "accountView.do") })
public String accountUpdate() throws Exception {
accountMessageUpdate();
return SUCCESS;
}


原因:浏览器上的URL位置改变了,再刷新页面也不会出现重复提交问题

其他:

若同时想向页面传输数据,但由于跳转该为REDICT而不是VELOCITY,采用如下办法

@Action(value = "accountUpdate", results = {
@Result(name = SUCCESS, params = {"flag", "${flag}"}, type = ResultTypeConstants.REDIRECT, location = "/accountView.do")})
public String test() {
return SUCCESS ;
}


其中flag可以设置为类的属性,通过set get方法,在整个类中都可以给他赋值,
也可以是方法中声明

扩展:

java防止表单重复提交

举例:生成token值

1.进入编辑添加页面

//跳转到添加或编辑页面时,设置token,防止重复提交
String tokenValue = UUID.randomUUID().toString();
//保存到session中
session.put("token", tokenValue);
//传值到页面上,提交操作时将从页面上获取的值与session中取的值进行比较
request.setAttribute("token", tokenValue);


2.编辑页面

<input name="token" type="hidden" value="$!token"/>


3.保存编辑操作

(1)token比较方法

//判断提交的json数据里的token和session里生成的token是否一致
private boolean isRepeat(String jsonToken){
		
Object st = session.get("token");
String stoken =  st != null? st.toString() :"";
		 
if(StringUtils.isBlank(stoken) || !stoken.equals(jsonToken)){
 return true;
}
return false;
}


若token值不同,则说明进行了多次提交

(2)调用


String rtoken = obj.get("token") != null ? obj.get("token")+"":"";
			
if(isRepeat(rtoken)){
json.put("data", -1);
json.put("msg", "重复提交!");
}

猜你喜欢

转载自mingyundezuoan.iteye.com/blog/2224212