springmvc防止表单重复提交demo

原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交;如果相等则不是重复提交。
实现技术:采用springmvc的拦截器统一处理
下面实现(五步)
第一步:

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;
}
第二步:拦截器


import java.lang.reflect.Method;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.xxx.annotation.anti_resubmit.Token;
/**
 * 防止重复提交
 * 
 * 
 */
public class TokenInterceptor extends HandlerInterceptorAdapter {
	private static final String TOKEN_NAME = "token";
	@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 need2SaveSession = annotation.save();
				if(need2SaveSession){
					request.getSession(false).setAttribute("token", UUID.randomUUID().toString());
				}
				boolean need2RemoveSession = annotation.remove();
				if(need2RemoveSession){
					if(isRepeatSubmit(request)){
						return false;
					}
					request.getSession(false).removeAttribute("token");
				}
			}
			return true;
		}else{
			return super.preHandle(request, response, handler);
		}
	}
	/**检查是否是重复提交(为空,不相等)*/
	private boolean isRepeatSubmit(HttpServletRequest request) {
		String serverToken = (String) request.getSession(false).getAttribute(TOKEN_NAME);//服务端
		if(serverToken == null){
			return true;
		}
		String clientToken = request.getParameter(TOKEN_NAME);//客户端
		if(clientToken == null){
			return true;
		}
		if(!serverToken.equals(clientToken)){
			return true;
		}
		return false;
	}
}
第三步:
springmvc配置文件(拦截器)
   <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
		<property name="interceptors">
			<list>
				<!-- <ref bean="wechatLoginInterceptor"/> -->
				<ref bean="tokenInteceptor"/>
			</list>
		</property>
	</bean>
	<bean id="tokenInteceptor" class="com.xxx.inteceptors.TokenInterceptor"/>
第四步:
controller中使用
	@RequestMapping("/add.jspf")
	@Token(save=true)
	public String add() {
		//省略
		return TPL_BASE + "index";
	}
	@RequestMapping("/save.jspf")
	@Token(remove=true)
	public void save() {
		//省略
	}
第五步:
页面
<input type="text" name="token" value="${token}"/>	

  

原文地址:https://www.cnblogs.com/ipetergo/p/6808081.html