spring自定义注解,防止页面重复提交

原创 2016年08月31日 11:52:35
注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DuplicateSubmitToken {
	 boolean bindToken() default true;
	 boolean unbindToken() default true;

}
拦截器:
package com.auspiciousclouds.support.spring.mvc.interceptor;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.bind.annotation.support.HandlerMethodResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.auspiciousclouds.config.Configuration;
import com.auspiciousclouds.kit.UUIDKit;
import com.auspiciousclouds.model.domain.UserDomain;
import com.auspiciousclouds.support.spring.mvc.annotation.DuplicateSubmitToken;

public class DuplicateSubmitTokenInterceptor  extends HandlerInterceptorAdapter implements ApplicationContextAware{
	private  ApplicationContext applicationContext ;
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		UserDomain sessionUser = UserDomain.get( request);
		 if (sessionUser != null) {
			 Method method = org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.class.getDeclaredMethod("getMethodResolver", Object.class); 
			 	method.setAccessible(true); 
			    HandlerMethodResolver resolver = (HandlerMethodResolver)method.invoke(applicationContext.getBean("annotationMethodHandlerAdapter"), handler);
			    Method resolveHandlerMethod = resolver.getClass().getMethod("resolveHandlerMethod", HttpServletRequest.class); 
			    resolveHandlerMethod.setAccessible(true); 
			    Method executorMethod = (Method)resolveHandlerMethod.invoke(resolver, request); 
	            DuplicateSubmitToken annotation = executorMethod.getAnnotation(DuplicateSubmitToken.class);
	            if (annotation != null) {
	                boolean bindSession = annotation.bindToken();
	                if (bindSession) {
	                    request.getSession(false).setAttribute(Configuration.SystemConstant.DUPLICATETOKEN, UUIDKit.getUUID());
	                }
	                boolean unbindSession = annotation.unbindToken();
	                if (unbindSession) {
	                    if (isDuplicateSubmitToken(request)) {
	                    	System.out.println("--------------------------------------------------------------------------DuplicateSubmitTokenInterceptor-----------------------------------------------------------------------------");
	                        return false;
	                    }
	                    request.getSession(false).removeAttribute(Configuration.SystemConstant.DUPLICATETOKEN);
	                }
	            }
	        }
	        return true;
	}
	/**
	 * 
	 * isDuplicateSubmitToken 判断是否是重复提交
	 *  
	 * @param request
	 * @return 
	 * boolean
	 * @exception 
	 * @since  1.0.0
	 */
	 private boolean isDuplicateSubmitToken(HttpServletRequest request) {
	        String serverToken = (String) request.getSession(false).getAttribute(Configuration.SystemConstant.DUPLICATETOKEN);
	        if (serverToken == null) {
	            return true;
	        }
	        String clinetToken = request.getParameter(Configuration.SystemConstant.DUPLICATETOKEN);
	        if (clinetToken == null) {
	            return true;
	        }
	        if (!serverToken.equals(clinetToken)) {
	            return true;
	        }
	        return false;
	    }

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex);
	}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}

}



使用 :
	@RequestMapping("/home")
	@DuplicateSubmitToken
	public String home(ModelMap model){}
版权声明:本文为博主原创文章,未经博主允许不得转载。

spring mvc防重复提交(第二种 自定义注解 以及 注解的实现 和 运用注解)

转载至 :http://blog.csdn.net/u013378306/article/details/52944780 第一种方法:判断session中保存的token比较麻烦,每次在提交表单时都...
  • Generosity55555
  • Generosity55555
  • 2017年12月05日 10:50
  • 121

使用自定义注解和token防止表单重复提交

1.自定义一个注解 package com.common.annotation; import java.lang.annotation.ElementType; import java.lang....
  • Nightliar
  • Nightliar
  • 2017年05月19日 14:17
  • 587

Spring MVC拦截器+注解方式实现防止表单重复提交

基本的原理: url请求时,用拦截器拦截,生成一个唯一的标识符(token),在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已...
  • zhang289202241
  • zhang289202241
  • 2017年04月26日 15:12
  • 1704

Spring MVC拦截器+注解方式实现防止表单重复提交

原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。 1.新建注解: ...
  • JDinis
  • JDinis
  • 2016年06月02日 15:36
  • 3525

spring boot 拦截器实现防重复提交

public class WeiguUrlInterceptor implements HandlerInterceptor {              public WeiguUrlInter...
  • e_laoye
  • e_laoye
  • 2016年05月13日 18:09
  • 4198

使用Spring AOP注解方式实现表单重复提交验证功能

使用Spring AOP注解方式实现表单重复提交验证功能
  • Geek_ymv
  • Geek_ymv
  • 2016年11月22日 20:52
  • 1381

ssm+拦截器做到利用token令牌机制防止数据重复提交

本人前段时间在公司参数了一个商城的项目,负责购物车+订单等一系列模块,但是这一块有个很大的隐患就是数据重复提交的问题,比如在下订单的时候以及确认购买付款的时候如果用户因为某些原因在短时间内连续点击了很...
  • Ice166
  • Ice166
  • 2017年11月07日 13:26
  • 329

记一次Spring MVC 一次请求,后台却访问两次的问题的解决方案

问题是提交表单的时候发现的,发现每次提交表单的时候提交的token都不正确,所以就debug了一下。这时候发现原来每次请求都会去走两遍controller,token会被覆盖。网上看了一些解决方案,可...
  • gongzhao426177
  • gongzhao426177
  • 2017年08月02日 13:19
  • 688

springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数

springMVC 数据绑定 多个对象 如何准确绑定? 遇到的问题: 我有Person和Cat两个类,他们都有name这个field,如果我有一个Controller的方法接收Cat和Perso...
  • y534560449
  • y534560449
  • 2017年06月08日 14:32
  • 486

spring mvc 防止重复提交表单的两种方法,推荐第二种

好的,下面来讲一下如何在Spring MVC里面解决此问题(其它框架也一样,逻辑一样,思想一样,和具体框架没什么关系)。要解决重复提交,有很多办法,比如说在提交完成后redirect一下,也可以用本文...
  • u013378306
  • u013378306
  • 2016年10月27日 12:56
  • 16016
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring自定义注解,防止页面重复提交
举报原因:
原因补充:

(最多只允许输入30个字)