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拦截器+注解方式实现防止表单重复提交

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

SpringMVC token 防止表单重复提交,加上注释,帮助理解

package com.framework.plugin.token; import java.lang.annotation.Retention; import java.lang.annota...

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

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

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

转:http://blog.csdn.net/dongpy1111/article/details/45149507 转载自https://m.oschina.net/blog/...

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

Spring MVC拦截器+注解方式实现防止表单重复提交 原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不...

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

转载自https://m.oschina.net/blog/191666 Spring MVC拦截器+注解方式实现防止表单重复提交 原理:在新建页面中Session保存token随机码,当保存时验...

Spring注解方式防止表单重复提交

今天在做自己的项目的时候,发现有很多的前段插件都自带了防止表单重复提交的功能,例如:ValidForm就提供了这个功能。但是前段的一些插件总是不太安全。 下面直接上代码: 1.创建Token注解@Ta...

spring自定义注解样例

  • 2016年05月17日 17:18
  • 10KB
  • 下载

Spring 自定义注解的解析

  • 2015年05月12日 16:07
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring自定义注解,防止页面重复提交
举报原因:
原因补充:

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