原理:在建立頁面中session儲存token随機碼,當儲存時驗證,通過後删除,當再次點選儲存時由于伺服器端的session中已經不存在了,所有無法驗證通過。
1.建立注解:
<a href="http://my.oschina.net/mushui/blog/143397#">?</a>
<code>/**</code>
<code> </code><code>* <p></code>
<code> </code><code>* 防止重複送出注解,用于方法上<br/></code>
<code> </code><code>* 在建立頁面方法上,設定needsavetoken()為true,此時攔截器會在session中儲存一個token,</code>
<code> </code><code>* 同時需要在建立的頁面中添加</code>
<code> </code><code>* <input type="hidden" name="token" value="${token}"></code>
<code> </code><code>* <br/></code>
<code> </code><code>* 儲存方法需要驗證重複送出的,設定needremovetoken為true</code>
<code> </code><code>* 此時會在攔截器中驗證是否重複送出</code>
<code> </code><code>* </p></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><</code><code>bean</code> <code>class</code><code>=</code><code>"org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping"</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"interceptors"</code><code>></code>
<code> </code><code><</code><code>list</code><code>></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"com.sohu.tv.crm.aop.userloginterceptor"</code><code>/></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"com.sohu.tv.crm.aop.avoidduplicatesubmissioninterceptor"</code><code>/></code>
<code> </code><code></</code><code>list</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
<code></</code><code>bean</code><code>></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><</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>></code>
轉自:http://my.oschina.net/mushui/blog/143397
特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt335