Spring MVC 用拦截器+token防止重复提交

最近再开发一个图书管理的项目,在线发布图书的时候,明明只点击了一下,偏偏却保存了多条记录,无奈之下只好加拦截器防止重复提交:

1:首先定义注解:

Java代码   收藏代码
  1. 首先自定义一个注解:  
  2.   
  3. package com.dinfo.interceptor;  
  4.   
  5. import java.lang.annotation.ElementType;  
  6. import java.lang.annotation.Retention;  
  7. import java.lang.annotation.RetentionPolicy;  
  8. import java.lang.annotation.Target;  
  9.   
  10. @Target(ElementType.METHOD)  
  11. @Retention(RetentionPolicy.RUNTIME)  
  12. public @interface Token {  
  13.   
  14.     boolean save() default false;  
  15.   
  16.     boolean remove() default false;  
  17. }  
  18. 2:<span style="">接着实现一个拦截器借口:  
  19. </span>  
Java代码   收藏代码
  1. package com.dinfo.interceptor;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import java.util.UUID;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import org.apache.log4j.Logger;  
  10. import org.springframework.web.method.HandlerMethod;  
  11. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  12.   
  13. public class TokenInterceptor extends HandlerInterceptorAdapter {  
  14.     private static final Logger LOG = Logger.getLogger(Token.class);  
  15.     @Override  
  16.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
  17.         if (handler instanceof HandlerMethod) {  
  18.             HandlerMethod handlerMethod = (HandlerMethod) handler;  
  19.             Method method = handlerMethod.getMethod();  
  20.             Token annotation = method.getAnnotation(Token.class);  
  21.             if (annotation != null) {  
  22.                 boolean needSaveSession = annotation.save();  
  23.                 if (needSaveSession) {  
  24.                     request.getSession(true).setAttribute("token", UUID.randomUUID().toString());  
  25.                 }  
  26.                 boolean needRemoveSession = annotation.remove();  
  27.                 if (needRemoveSession) {  
  28.                     if (isRepeatSubmit(request)) {  
  29.                         LOG.warn("please don't repeat submit,url:"+ request.getServletPath());  
  30.                         return false;  
  31.                     }  
  32.                     request.getSession(true).removeAttribute("token");  
  33.                 }  
  34.             }  
  35.             return true;  
  36.         } else {  
  37.             return super.preHandle(request, response, handler);  
  38.         }  
  39.     }  
  40.   
  41.     private boolean isRepeatSubmit(HttpServletRequest request) {  
  42.         String serverToken = (String) request.getSession(true).getAttribute("token");  
  43.         if (serverToken == null) {  
  44.             return true;  
  45.         }  
  46.         String clinetToken = request.getParameter("token");  
  47.         if (clinetToken == null) {  
  48.             return true;  
  49.         }  
  50.         if (!serverToken.equals(clinetToken)) {  
  51.             return true;  
  52.         }  
  53.         return false;  
  54.     }  
  55. }  

 3: spring 拦截器配置:

Xml代码   收藏代码
  1. <mvc:interceptors>  
  2.         <!-- 配置Token拦截器,防止用户重复提交数据 -->  
  3.         <mvc:interceptor>  
  4.             <mvc:mapping path="/**"/><!--这个地方时你要拦截得路径 我这个意思是拦截所有得URL-->  
  5.             <bean class="com.dinfo.interceptor.TokenInterceptor"/><!--class文件路径改成你自己写得拦截器路径!! -->  
  6.         </mvc:interceptor>  
  7. </mvc:interceptors>  

 4:在跳转页面的方法加上  @Token(save=true)

Java代码   收藏代码
  1. @RequestMapping(value = "/webui/payPage.html", method = RequestMethod.GET)  
  2.     @Token(save=true)  
  3.     public ModelAndView gonext(HttpServletRequest request,  
  4.                                HttpServletResponse response, ModelMap model, String  id,int number) {  
  5.         ModelAndView mv=new ModelAndView();  
  6.         FmUtils.FmData(request,model);  
  7.         if(!StringUtils.isEmpty(id)) {  
  8.             TudouBookInfo bookInfo=bookService.findById(id);  
  9.             if(!StringUtils.isEmpty(bookInfo)){  
  10.                 bookInfo.setNumber(number);  
  11.                 float price=Float.parseFloat(bookInfo.getPrice());  
  12.                 float totalPrice=number *price;  
  13.                 bookInfo.setTotalPrice(totalPrice+"");  
  14.                 mv.addObject("book",bookInfo);  
  15.             }  
  16.         }  
  17.         mv.setViewName(MobilePageContants.MY_PAY_PAGE);  
  18.         mv.addObject("token",id);  
  19.         return mv;  
  20.     }  

 5:在提交的方法上加    @Token(remove=true)

Java代码   收藏代码
  1. @RequestMapping(value = "/webui/paysave.html", method = RequestMethod.POST)  
  2.     @Token(remove=true)  
  3.     public ModelAndView paysave(HttpServletRequest request,  
  4.                                    HttpServletResponse response, ModelMap model, String  id,String number) {  
  5.         ModelAndView mv=new ModelAndView();  

 

 6:OK,到这里大功告成,你就可以发现已经没有办法重复提交数据了!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值