最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦。
后来在网上搜索后发现不错的方案如下:注解加拦截器完成
首先创建注解token:
@Target(ElementType.METHOD)//设置注解的可用范围-这里是方法上 @Retention(RetentionPolicy.RUNTIME)//设置注解的作用范围 public @interface Token { boolean save() default false; boolean remove() default false; }
创建token拦截器:
1 public class TokenInterceptor extends HandlerInterceptorAdapter { 2 3 @Override 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 5 if (handler instanceof HandlerMethod) { 6 HandlerMethod handlerMethod = (HandlerMethod) handler; 7 Method method = handlerMethod.getMethod(); 8 9 Token annotation = method.getAnnotation(Token.class); 10 if (annotation != null) { 11 boolean needSaveSession = annotation.save(); 12 if (needSaveSession) { 13 request.getSession(false).setAttribute("token", UUID.randomUUID().toString()); 14 15 } 16 boolean needRemoveSession = annotation.remove(); 17 if (needRemoveSession) { 18 if (isRepeatSubmit(request)) { 19 return false; 20 } 21 request.getSession(false).removeAttribute("token"); 22 } 23 } 24 return true; 25 } else { 26 return super.preHandle(request, response, handler); 27 } 28 } 29 30 private boolean isRepeatSubmit(HttpServletRequest request) { 31 String serverToken = (String) request.getSession(false).getAttribute("token"); 32 if (serverToken == null) { 33 return true; 34 } 35 String clinetToken = request.getParameter("token"); 36 if (clinetToken == null) { 37 return true; 38 } 39 if (!serverToken.equals(clinetToken)) { 40 return true; 41 } 42 return false; 43 } 44 }
然后在配置文件中配置好拦截器:注意这种方式在配置注解的处理器的时候需要配置:请求映射的方法处理器以及请求映射处理的适配器,如果使用
1 <bean 2 class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />这个默认的会找不到方法处理器 3 4 5 6 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 7 <property name="interceptors"> 8 <list> 9 <bean class="com.rbao.east.interceptor.TokenInterceptor"/> 10 </list> 11 </property> 12 </bean> 13 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
然后在需要生成token的方法上面添加@Token(save = true)
需要进行校验的方法上添加@Token(remove = true)
最后在显示页面上添加隐藏字段:
<input type="hidden" name="token" value="${token}" />
本文来自:
http://blog.icoolxue.com/submitted-by-spring-mvc-to-prevent-data-duplication/
以及
http://chenzhou123520.iteye.com/blog/1702563
结合
Spring太'激情'了.有好的文章希望能推荐推荐
如果有什么好的方案,希望各位朋友推荐推荐相互学习,多谢~~~