采用filter来全局控制重复提交
filter拦截需要控制重复提交的页面
filter中获取该页面的所有参数值
将参数值字符串进行计算hash值存入session,或者数据库中,保存最近一次操作的hash值
获取session中最近的hash值和本次获取参数值计算所得的hash值对比,,相同则为重复提交,不同则放行
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
Integer session_token = (Integer)request.getSession(true).getAttribute("token");
Enumeration<String> en= request.getParameterNames();
System.out.println("==session token:"+session_token);
String strcode = "";
while(en.hasMoreElements()){
strcode +=request.getParameter(en.nextElement());
}
//将表单页面所有值相加字符串进行hash计算
int hash_token = strcode.hashCode();
//两次hash值相同,则表示为重复提交
if(session_token!=null&&session_token==hash_token){
response.sendRedirect(request.getContextPath()+"/chongfu.do");
}else {
//session中保持最近一次表单hash值
request.getSession(true).setAttribute("token", hash_token);
chain.doFilter(req, res);
}
}