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

1 篇文章 0 订阅
1 篇文章 0 订阅

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里的处理,避免多次弹窗提示。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值