使用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 复制代码

最新文章

  1. 你可能不知道的陷阱, IEnumerable接口
  2. Hide JSP error icons in Eclipse
  3. C语言回顾-指针
  4. 学习SVG系列(4):SVG滤镜效果
  5. 你认为你很了解Javascript?
  6. 关于IOS网络通信的学习
  7. Google幻灯片
  8. 一个ASP.NET Web API 2.0应用
  9. Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)
  10. java异步线程池同时请求多个接口数据
  11. cocos2dx - 在MFC中使用cocos2dx
  12. Oracle DB Day02(SQL)
  13. NPM修改默认全局安装路径
  14. [转]koa-router使用指南
  15. linux&amp;Mysql
  16. SQL强化练习(面试与学习必备)
  17. jmeter配置脚本录制进行抓包并快速分析、定位接口问题
  18. ZJOI 2015 幻想乡战略游戏(动态点分治)
  19. centos 6.5 上安装使用upsource
  20. Simple2D-22(重构)纹理池

热门文章

  1. JavaSpring【二、IOC】
  2. Spark集群任务提交流程----2.1.0源码解析
  3. Computer Vision_2_Active Shape Models:Active Shape Models-Their Training and Application——1995
  4. 如何处理不能新建word、excel、PPT的情况?
  5. 前端基础(四):BOM和DOM
  6. P2057 善意的投票 最小割理解
  7. 常量和iota
  8. CSCD核心,北大中文核心
  9. CSS样式设置小技巧
  10. Java反射的使用