定义注解

/**
 * @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){
    }
posted on 2018-01-13 15:13  2637282556  阅读(118)  评论(0编辑  收藏  举报