定义注解
/**
* @ClassName SameUrlData
* @Description TODO(自定义的注解,用于防止表单重复提交)
* @author feizhou
* @Date 2018年1月10日 下午4:25:02
* @version 1.0.0
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SameUrlData {
}
配置拦截器
<!--处理表单重复提交 -->
<mvc:interceptor>
<mvc:mapping path="/**/*.do" />
<bean class="cn.xiniu.interceptor.common.SameUrlDataInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器类
package cn.xiniu.interceptor.common;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.google.gson.JsonObject;
import cn.xiniu.common.annotation.SameUrlData;
import cn.xiniu.common.web.WebTool;
import net.sf.json.JSONObject;
/**
*
* @ClassName URlInterceptor
* @Description TODO(利用拦截器机制给静态资源url(js,css)加上时间戳,来防止js和css文件的缓存)
* @author feizhou
* @Date 2017年9月22日 下午1:40:26
* @version 1.0.0
*/
public class SameUrlDataInterceptor extends HandlerInterceptorAdapter{
/* (非 Javadoc)
* Description:
* @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
SameUrlData annotation = method.getAnnotation(SameUrlData.class);
if (annotation != null) {
if(repeatDataValidator(request))//如果重复相同数据
return false;
else
return true;
}
return true;
}
else {
return super.preHandle(request, response, handler);
}
}
/**
* 验证同一个url数据是否相同提交 ,相同返回true
* @param httpServletRequest
* @return
*/
public boolean repeatDataValidator(HttpServletRequest httpServletRequest)
{
// String params=JsonMapper.toJsonString(httpServletRequest.getParameterMap());
String params = JSONObject.fromObject(httpServletRequest.getParameterMap()).toString();
String url=httpServletRequest.getRequestURI();
Map<String,String> map=new HashMap<String,String>();
map.put(url, params);
String nowUrlParams=map.toString();//
Object preUrlParams=httpServletRequest.getSession().getAttribute("repeatData");
if(preUrlParams==null)//如果上一个数据为null,表示还没有访问页面
{
httpServletRequest.getSession().setAttribute("repeatData", nowUrlParams);
return false;
}
else//否则,已经访问过页面
{
if(preUrlParams.toString().equals(nowUrlParams))//如果上次url+数据和本次url+数据相同,则表示城府添加数据
{
return true;
}
else//如果上次 url+数据 和本次url加数据不同,则不是重复提交
{
httpServletRequest.getSession().setAttribute("repeatData", nowUrlParams);
return false;
}
}
}
}
在需要的防止表单的地方加上注解
@SameUrlData
@RequestMapping("/supplementaryBudget/insert")
public void insert(HttpServletRequest request,HttpServletResponse response){
}