问题:
表单提交页面,刷新后,出现数据重复提交问题
原因:
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", "重复提交!");
}