今天在和同事调试bug时,发现页面以post方式提交的数据,在刷新浏览器的时会重复提交。处理完这个问题后我写下了这篇文章。
我现在知道可以处理重复提交的方式有两种:
(1)使用Token值。类似于验证码的处理方式。用户在每次提交时由于Token值不同,就不会出现这个问题了:
public class TokenProcesser {
/**
* 在session中保存token值
* */
public synchronized static String saveTokenToSession(HttpSession session){
if(session ==null){
return null;
}
StringBuffer token=new StringBuffer();
for(int i=0;i< 10; i++){
Random ram=new Random();
token.append(String.valueOf(ram.nextInt(100)));
}
session.setAttribute("tokenvalue", token.toString());
return token.toString();
}
public static String getTokenStringInSession(HttpSession session){
if(session ==null){
return null;
}
return (String)session.getAttribute("tokenvalue");
}
/**
* 在session中删除tokenz值
*
* */
public synchronized static void removeTokenInSession(HttpSession session){
if(session ==null){
return;
}
session.removeAttribute("tokenvalue");
}
}
在方法中调用时,在渲染这个页面的方法时,生成Token值并保存到session中,而在处理Form提交的Action类里,在session获得此Token值。如果相等则程序继续,并调用上面的方法生成新的Token值保存到session中,否则结束程序,返回以前的页面。
(2)页面重定向
在Action中处理完post 表单提交数据后,用Get的方式重定向到原来的页面。这个要根据不同的MVC框架来决定具体的用法。我使用的是sofaMVC。
在sofa中,很简单:直接返回视图名称。例如:return “redirect:index.htm”