springMVC处理表单重复提交,包含页面多个嵌套提交的情况,自定义token处理

xiaoxiao2021-02-28  62

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) { String key = annotation.key(); boolean needSaveSession = annotation.save(); if (needSaveSession) { request.getSession(true).setAttribute("token" + key, UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request, key)) { LOG.warn("please don't repeat submit,url:" + request.getServletPath()); return false; } request.getSession(true).removeAttribute("token" + key); } } return true; } else { return super.preHandle(request, response, handler); } } private boolean isRepeatSubmit(HttpServletRequest request, String key) { String serverToken = (String) request.getSession(true).getAttribute("token" + key); if (serverToken == null) { return true; } String clinetToken = request.getParameter("token" + key); if (clinetToken == null) { return true; } if (!serverToken.equals(clinetToken)) { return true; } return false; } } token实现

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Token { boolean save() default false; String key() default ""; boolean remove() default false; }

controller:

@Token(save=true,key="1") //进入页面时 @Token(remove=true,key="1") //提交表单时 jsp:

<input type="hidden" id="token" value="${token1 }"/>js:

$.ajax请求时 data:{ "token1":$('#token').val() }, 不同的提交给不同的key,避免多个提交时session里的uid相同的情况,没有嵌套提交的情况时不给key即可,后台根据uid判断是否重复提交,进行拦截,建议配合js里的处理,避免多次弹窗提示。

转载请注明原文地址: https://www.6miu.com/read-28712.html

最新回复(0)