zoukankan      html  css  js  c++  java
  • 使用redis防止重复提交

    使用redis防止重复提交

     

    其实主要思路是他的https://blog.csdn.net/u013378306/article/details/52944780

    主要目前我的情况是,前后端分离的,前端没有session ,所以使用redis来存放数据。

    自定义注解

    复制代码
    package com.cdp.api.onboarding.interceptor;
     
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
     
    /**
     * 一个用户 相同url 同时提交 相同数据 验证
     * @author Administrator
     *
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SameUrlData {
     
        
    }
    复制代码

    自定义拦截器

    复制代码
    package com.cdp.api.onboarding.interceptor;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    import com.alibaba.druid.util.IOUtils;
    import com.cdp.api.common.util.CommonUtil;
    import com.cdp.api.common.util.DateUtil;
    import com.cdp.api.common.util.JedisUtil;
    import com.cdp.api.common.util.StringUtil;
    
    /**
     * 
     * @author Administrator
     * 
     */
    public class SameUrlDataInterceptor extends HandlerInterceptorAdapter {
    
        private static final Logger logger = LoggerFactory
                .getLogger(CommonUtil.class);
    
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
            if (handler instanceof HandlerMethod) {
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                Method method = handlerMethod.getMethod();
                SameUrlData annotation = method.getAnnotation(SameUrlData.class);
                if (annotation != null) {
                    if (repeatDataValidator(request)) {
                        logger.debug(DateUtil
                                .getTimeString_Now("yyyy-MM-dd HH:mm:ss")
                                + " -- 重复请求 -- ");
                        return false;
                    }// 如果重复相同数据
                    else
                        return true;
                }
                return true;
            } else {
                return super.preHandle(request, response, handler);
            }
        }
    
        /**
         * 验证同一个url数据是否相同提交 ,相同返回true
         * 
         * @param request
         * @return
         * @throws Exception
         */
        public boolean repeatDataValidator(HttpServletRequest request)
                throws Exception {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    request.getInputStream()));
            // 判断body
            String body = IOUtils.read(reader);
            String url = request.getRequestURI();
            Map<String, String> map = new HashMap<String, String>();
            map.put(url, body);
            String nowUrlParams = map.toString();//
    
            String preUrlParams = JedisUtil.getFromRedis(url);
            if (StringUtil.isNullOrBlank(preUrlParams))// 如果上一个数据为null,表示还没有访问页面
            {
                // 扔redis
                JedisUtil.saveInRedis(url, nowUrlParams, 60);
                logger.debug(DateUtil.getTimeString_Now("yyyy-MM-dd HH:mm:ss")
                        + " -- 设置preUrlParams -- " + nowUrlParams);
                return false;
            } else// 否则,已经访问过页面
            {
                if (preUrlParams.toString().equals(nowUrlParams))// 如果上次url+数据和本次url+数据相同,则表示重复添加数据
                {
                    logger.debug(DateUtil.getTimeString_Now("yyyy-MM-dd HH:mm:ss")
                            + " -- 重复提交preUrlParams -- ");
                    return true;
                } else// 如果上次 url+数据 和本次url加数据不同,则不是重复提交
                {
                    logger.debug(DateUtil.getTimeString_Now("yyyy-MM-dd HH:mm:ss")
                            + " -- 重新设置preUrlParams -- " + nowUrlParams);
                    JedisUtil.saveInRedis(url, nowUrlParams, 60);
                    return false;
                }
    
            }
        }
    
    }
    复制代码

    拦截器的配置

    复制代码
    <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**" />
                <mvc:exclude-mapping path="/login" />
                <mvc:exclude-mapping path="/token/get" />
                <mvc:exclude-mapping path="/file/**" />
                <mvc:exclude-mapping path="/wx/**" />
                <mvc:exclude-mapping path="/wxCompany/**" />
                <mvc:exclude-mapping path="/wxOnFamily/**" />
                <mvc:exclude-mapping path="/wxlogin/**" />
                <mvc:exclude-mapping path="/wxMaterial/**" />
                <mvc:exclude-mapping path="/wxOfferManagement/**" />
                <mvc:exclude-mapping path="/wxOnEmployee/**" />
                <mvc:exclude-mapping path="/wxOnEducation/**" />
                <mvc:exclude-mapping path="/wxOnTraining/**" />
                <mvc:exclude-mapping path="/wxOnWork/**" />
                <mvc:exclude-mapping path="/wxTeam/**" />
                <mvc:exclude-mapping path="/wxTemplatePage/**" />
                <mvc:exclude-mapping path="/wxWelcomePage/**" />
                <mvc:exclude-mapping path="/wxIdPhoto/**" />
                <mvc:exclude-mapping path="/offer/excel_offer/import" />
                <bean class="com.cdp.api.onboarding.interceptor.SameUrlDataInterceptor"></bean>
            </mvc:interceptor>
    复制代码

    ps,使用的时候要在controller加上注解

    按 Ctrl+C 复制代码
    按 Ctrl+C 复制代码
  • 相关阅读:
    ue4同c#通信时的中文乱码问题
    ue4 fstring 和std::string互转
    LinqToExcel 简洁与优美开源库
    虚幻UE4的后处理特效介绍 http://www.52vr.com/thread-31215-1-1.html
    为什么你应该使用OpenGL而不是DirectX?
    会写代码是你创业路上的包袱
    (转载)怎样解决SQL Server内存不断增加问题
    UE4 Pak 相关知识总结
    淘宝运营实战操作大纲
    淘宝运营
  • 原文地址:https://www.cnblogs.com/zhoading/p/11250197.html
Copyright © 2011-2022 走看看