Spring MVC防止數據重複提交

        要解決重複提交,有不少辦法,好比說在提交完成後redirect一下,也能夠用本文提到的使用token的方法(我不使用redirect是由於那樣解決不了ajax提交數據或者移動應用提交數據,另外一個緣由是如今比較通行的方法是使用token,像python裏的django框架也是使用token來解決)。java

        使用token的邏輯是,給全部的url加一個攔截器,在攔截器裏面用java的UUID生成一個隨機的UUID並把這個UUID放到session裏面,而後在瀏覽器作數據提交的時候將此UUID提交到服務器。服務器在接收到此UUID後,檢查一下該UUID是否已經被提交,若是已經被提交,則不讓邏輯繼續執行下去…python

      好的,來點實際代碼,也許實際代碼纔是最好的老師:
註解Token代碼:web




@Target (ElementType.METHOD)ajax

@Retention(RetentionPolicy.RUNTIME)spring

public @interface Token {django

 

    boolean save() default false;瀏覽器

 

    boolean remove() default false;服務器

}session

攔截器TokenInterceptor代碼:mvc




public class TokenInterceptor extends HandlerInterceptorAdapter {

 

    @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(false).setAttribute("token", UUID.randomUUID().toString());

                }

                boolean needRemoveSession = annotation.remove();

                if (needRemoveSession) {

                    if (isRepeatSubmit(request)) {

                        return false;

                    }

                    request.getSession(false).removeAttribute("token");

                }

            }

            return true;

        } else {

            return super.preHandle(request, response, handler);

        }

    }

 

    private boolean isRepeatSubmit(HttpServletRequest request) {

        String serverToken = (String) request.getSession(false).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;

    }

}

而後在Spring MVC的配置文件里加入:

XHTML


    <!-- 攔截器配置 -->

    <mvc:interceptors>

        <!-- 配置Token攔截器,防止用戶重複提交數據 -->

        <mvc:interceptor>

            <mvc:mapping path="/**"/>

            <bean class="com.storezhang.web.spring.TokenInterceptor"/>

        </mvc:interceptor>

    </mvc:interceptors>

相關代碼已經註釋,相信你能看懂。
關於這個方法的用法是:在須要生成token的controller上增長@Token(save=true),而在須要檢查重複提交的controller上添加@Token(remove=true)就能夠了。
另外,你須要在view裏在form裏增長下面代碼:

XHTML

1

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

已經完成了,去試試看你的數據還能重複提交了吧。

相關文章
相關標籤/搜索