美文网首页
防止表单提交

防止表单提交

作者: 宙斯是只猫 | 来源:发表于2018-05-14 12:06 被阅读0次

此防止指正常提交时,多次点击,也可以通过前台按钮禁止来控制,主要思路就是,新进页面的时候在session中产生一个token,
把这个token放入session和request中,表单提交时,把request返回的token一块提交,在环绕通知中判断session的token和request中的token是否一致,如果一致则提交并变更session中的token
当表单提交后,未刷新页面,此时页面的token是上一次的token,在再提交表单会提交不上,从而达到防止重复提交的目的,如果提交表单的表单是个弹框,则需要刷新页面

   //此注解加在跳转路由的方法上,进入此页面则在session和request中放入token
   @Retention(RetentionPolicy.RUNTIME)
   @Target(ElementType.METHOD)
   @Documented
   public @interface GenrateFormToken {
   }

   //拦截方法为一个后置通知
    @Aspect
    @Component
    public class GenerateFormTokenAspectJ {
    @After("@annotation(com.duia.common.annotation.GenrateFormToken)")
    public void beforeMethod(JoinPoint point) throws Throwable {
        SysContent.getSession().setAttribute("forbidResubmissionToken", UUID.randomUUID().toString());
        SysContent.getRequest().setAttribute("formToken", SysContent.getSession().getAttribute("forbidResubmissionToken"));
    }
}

    //此注解加在表单提交的方法上,表示需要走表单token对比的aop方法
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Documented
    public @interface ForbidResubmission {
    }

    //走拦截处理判断是否相等,return null这个可以抛出指定异常,如new FormReSubmissionException(),在统一的异常处理器中返回给前台,前台在根据返回类型提示用户请勿重复提交
    @Aspect
    @Component
    public class ForbidResubmissionAspectJ {
        @Around("@annotation(com.duia.common.annotation.ForbidResubmission)")
        public Object around(ProceedingJoinPoint point) throws Throwable {
            Object forbidResubmissionToken = SysContent.getSession().getAttribute("forbidResubmissionToken");
            Objects.requireNonNull(forbidResubmissionToken);
            Object[] args = point.getArgs();
            String formToken = SysContent.getRequest().getParameter("formToken");
            if (forbidResubmissionToken instanceof String ) {
                String forbidResubmissionToken1 = (String) forbidResubmissionToken;
                String formToken1 = (String) formToken;
                if (forbidResubmissionToken1.equals(formToken1)) {
                    SysContent.getSession().setAttribute("forbidResubmissionToken", UUID.randomUUID().toString());
                    return point.proceed(args);
                }
                return null;
            }
            return null;

        }
    }

    //工具类,通过过滤器中filter方法获取request和response,并保存到threadLocal中,主要参考自...妈的,找不到了,下次找到补上吧
    public class GetContentFilter implements Filter {
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }

        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1,
                             FilterChain arg2) throws IOException, ServletException {
            SysContent.setRequest((HttpServletRequest) arg0);
            SysContent.setResponse((HttpServletResponse) arg1);
            arg2.doFilter(arg0, arg1);
        }

        @Override
        public void init(FilterConfig arg0) throws ServletException {
        }
    }
    public class SysContent {
        private static ThreadLocal<HttpServletRequest> requestLocal = new ThreadLocal<HttpServletRequest>();
        private static ThreadLocal<HttpServletResponse> responseLocal = new ThreadLocal<HttpServletResponse>();

        public static HttpServletRequest getRequest() {
            return (HttpServletRequest) requestLocal.get();
        }

        public static void setRequest(HttpServletRequest request) {
            requestLocal.set(request);
        }

        public static HttpServletResponse getResponse() {
            return (HttpServletResponse) responseLocal.get();
        }

        public static void setResponse(HttpServletResponse response) {
            responseLocal.set(response);
        }

        public static HttpSession getSession() {
            return (HttpSession) ((HttpServletRequest) requestLocal.get()).getSession();
        }
    }

[实现思想主要参考自java web技术内幕,表单防重]

相关文章

  • 防止表单提交

    此防止指正常提交时,多次点击,也可以通过前台按钮禁止来控制,主要思路就是,新进页面的时候在session中产生一个...

  • 防止表单重复提交

    嘿,大家好,今天我来介绍几种简单的防止表单重复提交的方法: 防止表单重复提交 方法一:前端方式 当点击提交或者保存...

  • 防止表单重复提交

    第一种(JavaScript): <%@ page language="java" import="java.ut...

  • 防止表单重复提交

    防止表单重复提交: 方法1:页面限制按钮 方法2:如图

  • 防止表单重复提交

    随机产生一个字符串(token) ,保存到session中,在向服务端发送请求时会携带token,本地token与...

  • 防止表单重复提交

    针对于重复提交的整体解决方案: 1.用redirect来解决重复提交的问题 2.点击一次之后,按钮失效 3.通过l...

  • 防止表单重复提交

    因为项目需要表单提交,可是发现了必须要防止用户提交,经过了几个小时的百度旅游总算找到的方法,其实说到底还是看官方手...

  • 防止表单重复提交

    一、前端控制(页面控制) 从前端控制主要方法就是点击提交后将提交按钮置灰,js中的提交方法不再响应提交事件 二、后...

  • 表单防止重复提交

    逻辑思路:1.提交数据之前判断当前提交按钮是否存在lock锁2.在ajax提交之前给提交按钮上锁3.ajax成功之...

  • 提交表单的代码困惑—解释preventDefault

    在使用vue的时候遇到表单提交总是要加上@submit.preventpreventDefault 是防止提交产生...

网友评论

      本文标题:防止表单提交

      本文链接:https://www.haomeiwen.com/subject/dgvddftx.html