解决SpringMVC表单重复提交总结
2016-10-24 17:23
197 查看
1.表单加添加隐藏域
2.编写Annotation
3.编写Inteceptor
4.在SpringMVC配置文件中注册Interceptor
Tips:在使用Ajax提交表单时注意获取隐藏域
<input type="hidden" name="token" value="${token}" id="token"/>
2.编写Annotation
package cn.zzu.wcj.interceptor.token; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Token { boolean save() default false; boolean remove() default false; }
3.编写Inteceptor
package cn.zzu.wcj.interceptor; import java.lang.reflect.Method; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import cn.zzu.wcj.interceptor.token.Token; public class TokenInterceptor extends HandlerInterceptorAdapter { private static final Logger LOG = Logger.getLogger(Token.class); @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(true).setAttribute("token", UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request)) { LOG.warn("please don't repeat submit,url:"+ request.getServletPath()); return false; } request.getSession(true).removeAttribute("token"); } } return true; } else { return super.preHandle(request, response, handler); } } private boolean isRepeatSubmit(HttpServletRequest request) { String serverToken = (String) request.getSession(true).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; } }
4.在SpringMVC配置文件中注册Interceptor
<mvc:interceptors> <!-- 配置Token拦截器,防止用户重复提交数据 --> <mvc:interceptor> <!--拦截所有得URL--> <mvc:mapping path="/**"/> <!--拦截器路径--> <bean class="cn.zzu.wcj.interceptor.TokenInterceptor"/> </mvc:interceptor> </mvc:interceptors>
Tips:在使用Ajax提交表单时注意获取隐藏域
<input type="hidden" name="token" value="${token}" id="token"/>的值作为参数传递到后台.
相关文章推荐
- SpringMVC避免表单的重复提交解决办法
- Struts -- Token机制(解决表单重复提交)
- 在页面中使用WebWork的token标签解决表单重复提交问题
- 如何解决Form表单的重复提交
- 用Struts的Token机制解决表单重复提交
- 使用Struts的Token机制解决表单的重复提交
- 使用Struts的Token机制解决表单的重复提交(转ewolf的工作专栏)
- 用Struts的Token机制解决表单重复提交
- 解决Form表单重复提交问题
- 使用Jquery Validation插件防止重复提交表单的解决方法
- 使用Struts的Token机制解决表单的重复提交
- asp.net中,表单提交后,防刷新重复提交、防后退解决办法
- ASP.NET防止表单重复提交解决办法搜集
- asp.net中,表单提交后,防刷新重复提交、防后退解决办法
- 使用Struts的Token机制解决表单的重复提交
- 用Struts的Token机制解决表单重复提交
- Struts的Token(令牌)机制解决表单重复提交的问题
- Jquery Validation插件防止重复提交表单的解决方法
- struts1 表单重复提交问题解决!!
- 使用Struts的Token机制解决表单的重复提交