您的位置:首页 > 编程语言 > Java开发

Spring MVC拦截器+注解方式实现防止表单重复提交

2014-04-11 11:11 726 查看
原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。

注解Token代码:


@Target
(ElementType.METHOD)


@Retention

(RetentionPolicy.RUNTIME)


public

@interface

Token {



boolean

save()

default

false

;



boolean

remove()

default

false

;


}


拦截器TokenInterceptor代码:

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的配置文件里加入:

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


<

mvc:interceptors

>



<!-- 配置Shiro拦截器,实现注册用户的注入 -->



<

mvc:interceptor

>



<

mvc:mapping

path

=

"/**"

/>



<

bean

class

=

"com.storezhang.video.shiro.ShiroInterceptor"

/>



</

mvc:interceptor

>



<!-- 配置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里增加下面代码:

<


input


type


=


"hidden"


name


=


"token"


value


=


"${token}"


/>

已经完成了,去试试看你的数据还能重复提交了吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: