• 161116、springmvc自己实现防止表单重复提交(基于注解)


    原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交;如果相等则不是重复提交。
    
    实现技术:采用springmvc的拦截器统一处理
    
    下面实现(五步)
    
    第一步:
    
    package com.xxx.utils.anti_resubmit;
    
    import java.lang.annotation.ElementType;
    
    import java.lang.annotation.Retention;
    
    import java.lang.annotation.RetentionPolicy;
    
    import java.lang.annotation.Target;
    
    /**
    
     * 防止重复提交用
    
     * @author wsc
    
     * 2016年12月5日
    
     */
    
    @Target(ElementType.METHOD)//如果用在类上,将此行注释
    
    @Retention(RetentionPolicy.RUNTIME)
    
    public @interface Token {
    
    boolean save() default false;  
    
    boolean remove() default false;
    
    }
    
    第二步:拦截器
    
    package com.xxx.inteceptors;
    
     
    
    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;
    
    /**
    
     * 防止重复提交
    
     * @author wsc
    
     * 2016年12月5日
    
     */
    
    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}"/>
    

      

  • 相关阅读:
    asp.net core 认证及简单集群
    Vue2.0 + Element-UI + WebAPI实践:简易个人记账系统
    Dapper关联查询
    sql模糊匹配中%、_的处理
    VS启用IIS调试的方法及可能碰到的问题。
    c#Winform程序,让pictureBox显示图像(包含GIF),并且不被占用,能即时删除图片。
    原创:无错版!让DEDE只生成一个RSS文件,不分栏目
    原创:js代码, 让dedecms支持Tag选择, 添加内容更为方便,不用手输Tag
    centos使用denyhosts的问题,会将自己的IP自动加到hosts.deny的解决办法。
    CentOS 5.6 netInstall可以的在线安装方式。
  • 原文地址:https://www.cnblogs.com/zrbfree/p/6141212.html
Copyright © 2020-2023  润新知