天天看點

Spring MVC攔截器+注解方式實作防止表單重複送出

原理:在建立頁面中session儲存token随機碼,當儲存時驗證,通過後删除,當再次點選儲存時由于伺服器端的session中已經不存在了,所有無法驗證通過。

1.建立注解:

<a href="http://my.oschina.net/mushui/blog/143397#">?</a>

<code>/**</code>

<code> </code><code>* &lt;p&gt;</code>

<code> </code><code>* 防止重複送出注解,用于方法上&lt;br/&gt;</code>

<code> </code><code>* 在建立頁面方法上,設定needsavetoken()為true,此時攔截器會在session中儲存一個token,</code>

<code> </code><code>* 同時需要在建立的頁面中添加</code>

<code> </code><code>* &lt;input type="hidden" name="token" value="${token}"&gt;</code>

<code> </code><code>* &lt;br/&gt;</code>

<code> </code><code>* 儲存方法需要驗證重複送出的,設定needremovetoken為true</code>

<code> </code><code>* 此時會在攔截器中驗證是否重複送出</code>

<code> </code><code>* &lt;/p&gt;</code>

<code> </code><code>* @author: chuanli</code>

<code> </code><code>* @date: 2013-6-27上午11:14:02</code>

<code> </code><code>*</code>

<code> </code><code>*/</code>

<code>@target</code><code>(elementtype.method)</code>

<code>@retention</code><code>(retentionpolicy.runtime)</code>

<code>public</code> <code>@interface</code> <code>avoidduplicatesubmission {</code>

<code>    </code><code>boolean</code> <code>needsavetoken()</code><code>default</code> <code>false</code><code>;</code>

<code>    </code><code>boolean</code> <code>needremovetoken()</code><code>default</code> <code>false</code><code>;</code>

<code>}</code>

2. 建立攔截器

<code> </code><code>* 防止重複送出過濾器</code>

<code> </code><code>* @date: 2013-6-27上午11:19:05</code>

<code>public</code> <code>class</code> <code>avoidduplicatesubmissioninterceptor</code><code>extends</code> <code>handlerinterceptoradapter {</code>

<code>    </code><code>private</code> <code>static</code> <code>final</code> <code>logger log = logger.getlogger(avoidduplicatesubmissioninterceptor.</code><code>class</code><code>);</code>

<code>    </code><code>@override</code>

<code>    </code><code>public</code> <code>boolean</code> <code>prehandle(httpservletrequest request,</code>

<code>            </code><code>httpservletresponse response, object handler)</code><code>throws</code> <code>exception {</code>

<code>        </code><code>user user = userutil.getuser();</code>

<code>        </code><code>if</code> <code>(user !=</code><code>null</code><code>) {</code>

<code>            </code><code>handlermethod handlermethod = (handlermethod) handler;</code>

<code>            </code><code>method method = handlermethod.getmethod();</code>

<code>            </code><code>avoidduplicatesubmission annotation = method.getannotation(</code>

<code>                                                        avoidduplicatesubmission.</code><code>class</code><code>);</code>

<code>            </code><code>if</code> <code>(annotation !=</code><code>null</code><code>) {</code>

<code>                </code><code>boolean</code> <code>needsavesession = annotation.needsavetoken();</code>

<code>                </code><code>if</code> <code>(needsavesession) {</code>

<code>                    </code><code>request.getsession(</code><code>false</code><code>).setattribute(</code><code>"token"</code><code>, </code>

<code>                          tokenprocessor.getinstance().generatetoken());</code>

<code>                </code><code>}</code>

<code>                </code><code>boolean</code> <code>needremovesession = annotation.needremovetoken();</code>

<code>                </code><code>if</code> <code>(needremovesession) {</code>

<code>                    </code><code>if</code> <code>(isrepeatsubmit(request)) {</code>

<code>                        </code><code>log.warn(</code><code>"please don't repeat submit,[user:"</code> <code>+ user.getusername() +</code><code>",url:"</code>

<code>                                </code><code>+ request.getservletpath() +</code><code>"]"</code><code>);</code>

<code>                        </code><code>return</code> <code>false</code><code>;</code>

<code>                    </code><code>}</code>

<code>                    </code><code>request.getsession(</code><code>false</code><code>).removeattribute(</code><code>"token"</code><code>);</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>        </code><code>return</code> <code>true</code><code>;</code>

<code>    </code><code>}</code>

<code>    </code><code>private</code> <code>boolean</code> <code>isrepeatsubmit(httpservletrequest request) {</code>

<code>        </code><code>string servertoken = (string) request.getsession(</code><code>false</code><code>).getattribute(</code><code>"token"</code><code>);</code>

<code>        </code><code>if</code> <code>(servertoken ==</code><code>null</code><code>) {</code>

<code>            </code><code>return</code> <code>true</code><code>;</code>

<code>        </code><code>string clinettoken = request.getparameter(</code><code>"token"</code><code>);</code>

<code>        </code><code>if</code> <code>(clinettoken ==</code><code>null</code><code>) {</code>

<code>        </code><code>if</code> <code>(!servertoken.equals(clinettoken)) {</code>

<code>        </code><code>return</code> <code>false</code><code>;</code>

3. 在spring中配置

<code>&lt;</code><code>bean</code> <code>class</code><code>=</code><code>"org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping"</code><code>&gt;</code>

<code>   </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"interceptors"</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>list</code><code>&gt;</code>

<code>          </code><code>&lt;</code><code>bean</code> <code>class</code><code>=</code><code>"com.sohu.tv.crm.aop.userloginterceptor"</code><code>/&gt;</code>

<code>          </code><code>&lt;</code><code>bean</code> <code>class</code><code>=</code><code>"com.sohu.tv.crm.aop.avoidduplicatesubmissioninterceptor"</code><code>/&gt;</code>

<code>      </code><code>&lt;/</code><code>list</code><code>&gt;</code>

<code>   </code><code>&lt;/</code><code>property</code><code>&gt;</code>

<code>&lt;/</code><code>bean</code><code>&gt;</code>

4. 在相關方法中加入注解:

<code>@requestmapping</code><code>(</code><code>"/save"</code><code>)</code>

<code> </code><code>@avoidduplicatesubmission</code><code>(needremovetoken =</code><code>true</code><code>)</code>

<code>    </code><code>public</code> <code>synchronized</code> <code>modelandview save(executionunit unit, httpservletrequest request, </code>

<code>                                          httpservletresponse response)</code>

<code>            </code><code>throws</code> <code>exception {</code>

<code>@requestmapping</code><code>(</code><code>"/edit"</code><code>)</code>

<code>    </code><code>@avoidduplicatesubmission</code><code>(needsavetoken =</code><code>true</code><code>)</code>

<code>    </code><code>public</code> <code>modelandview edit(integer id, httpservletrequest request)</code><code>throws</code> <code>exception {</code>

5.在建立頁面中加入

1

<code>     </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"hidden"</code> <code>name</code><code>=</code><code>"token"</code> <code>value</code><code>=</code><code>"${token}"</code><code>&gt;</code>

轉自:http://my.oschina.net/mushui/blog/143397

特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt335