解决SpringMVC表单重复提交总结

来源:互联网 发布:排序算法比较次数 编辑:程序博客网 时间:2024/05/23 00:29

1.表单加添加隐藏域

<input type="hidden" name="token" value="${token}" id="token"/>

2.编写Annotation

package cn.zzu.wcj.interceptor.token;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Token {    boolean save() default false;    boolean remove() default false;}

3.编写Inteceptor

package cn.zzu.wcj.interceptor;import java.lang.reflect.Method;import java.util.UUID;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import cn.zzu.wcj.interceptor.token.Token;public class TokenInterceptor extends HandlerInterceptorAdapter {    private static final Logger LOG = Logger.getLogger(Token.class);    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        if (handler instanceof HandlerMethod) {            HandlerMethod handlerMethod = (HandlerMethod) handler;            Method method = handlerMethod.getMethod();            Token annotation = method.getAnnotation(Token.class);            if (annotation != null) {                boolean needSaveSession = annotation.save();                if (needSaveSession) {                    request.getSession(true).setAttribute("token", UUID.randomUUID().toString());                }                boolean needRemoveSession = annotation.remove();                if (needRemoveSession) {                    if (isRepeatSubmit(request)) {                         LOG.warn("please don't repeat submit,url:"+ request.getServletPath());                        return false;                    }                    request.getSession(true).removeAttribute("token");                }            }            return true;        } else {            return super.preHandle(request, response, handler);        }    }    private boolean isRepeatSubmit(HttpServletRequest request) {        String serverToken = (String) request.getSession(true).getAttribute("token");        if (serverToken == null) {            return true;        }        String clinetToken = request.getParameter("token");        if (clinetToken == null) {            return true;        }        if (!serverToken.equals(clinetToken)) {            return true;        }        return false;    }}

4.在SpringMVC配置文件中注册Interceptor

    <mvc:interceptors>            <!-- 配置Token拦截器,防止用户重复提交数据 -->            <mvc:interceptor>                <!--拦截所有得URL-->                <mvc:mapping path="/**"/>                <!--拦截器路径-->                <bean class="cn.zzu.wcj.interceptor.TokenInterceptor"/>            </mvc:interceptor>    </mvc:interceptors>

Tips:在使用Ajax提交表单时注意获取隐藏域<input type="hidden" name="token" value="${token}" id="token"/>的值作为参数传递到后台.

0 0