zoukankan      html  css  js  c++  java
  • 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}"/>	
    

      

  • 相关阅读:
    Ts基础
    SWF 文件不能本地访问 只有仅限于文件系统的 SWF 文件
    laya的UI编辑器
    目前支持WebGL的浏览器有哪些?
    Laya学习
    egret学习
    PHP 获取上月,本月,近15天,近30天日期
    深入浅出:MySQL的左连接、右连接、内连接
    div中 li宽度不固定 ie6和ie7不兼容不自动换行
    8款给力HTML5/CSS3应用插件 可爱的HTML5笑脸
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6808081.html
Copyright © 2011-2022 走看看