网易首页 > 网易号 > 正文 申请入驻

SSM框架防止重复请求

0
分享至

SSM框架防止重复请求

源:http://www.bj9420.com

编者: wRitchie(吴理琪)

SSM框架,即Spring+Spring MVC+Mybatis,在实践中由于网络延迟或多次点击提交等原因产生一个请求发送多次的情况,实际上,第一个请求才是客户端发送的,后面的请求对客户端并无意义。比如,客户端发送了三次保存的请求,实际上,客户端只想保存一条记录,而服务端却保存了三条,这导致重复数据,并且这些数据会对系统造成不必要的影响。另一种典型场景,用户提现,如重复提交,会导致多次提现,会带来巨大的经济损失,为了防止此类情况发生,需解决重复提交表单,解决方式思路,验证同一个URL及数据参数是否相同,如相同,则重复提交,否则,正常提交。

一、 SSM框架后端解决

1、 自定义防止重复的注解

1.packagecom.bj9420.framework.interceptor;
2.
3.importjava.lang.annotation.ElementType;
4.importjava.lang.annotation.Retention;
5.importjava.lang.annotation.RetentionPolicy;
6.importjava.lang.annotation.Target;
7.
8. /**
9. * @author :wRitchie
10. * @Description :自定义防止重复的注解
11. * @Title :PreventRepeat.java
12. * @date 2020/12/7 13:45
13. * @Version :V1.0
14. * @Copyright (c):http://www.bj9420.com 2020 All rights reserved.
15. */
16. @Target(ElementType.METHOD)
17. @Retention(RetentionPolicy.RUNTIME)
18.public@interfacePreventRepeat {
19. }

2、 自定义拦截器

1.packagecn.airbest.framework.interceptor;
2.
3.importcn.airbest.constants.SystemConstant;
4.importcn.airbest.model.Result;
5.importcom.alibaba.fastjson.JSON;
6.importcom.fasterxml.jackson.databind.ObjectMapper;
7.importlombok.extern.slf4j.Slf4j;
8.importorg.springframework.web.method.HandlerMethod;
9.importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;
10.
11.importjavax.servlet.http.HttpServletRequest;
12.importjavax.servlet.http.HttpServletResponse;
13.importjava.io.PrintWriter;
14.importjava.lang.reflect.Method;
15.importjava.util.HashMap;
16.importjava.util.Map;
17.
18. /**
19. * @author :wRitchie
20. * @Description :相同url和数据拦截器 为了防止重复提交等操作
21. * 继承拦截器适配器
22. * @Title :SameUrlDataInterceptor.java
23. * @date 2020/12/7 13:47
24. * @Version :V1.0
25. * @Copyright (c):http://wwww.bj9420.com 2020 All rights reserved.
26. */
27. @Slf4j
28.publicclassRepeatUrlDataInterceptorextendsHandlerInterceptorAdapter {
29. /**
30. * @Author: wRitchie
31. * @Description: preHandle 覆盖父类的preHandle方法
32. * 预处理回调方法,实现处理器的预处理,验证是否为重复提交,第三个参数为响应的处理器,自定义Controller
33. * 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
34. * @Param: [request, response, handler]
35. * @return: boolean
36. * @Date: 2020/12/7 13:54
37. */
38. @Override
39.publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throwsException {
40. // 1、判断handler参数是否为HandlerMethod类的实例
41.if(handlerinstanceofHandlerMethod) {
42. // 2、获取方法注解查看方式是否有PreventRepeat注解
43. HandlerMethod handlerMethod = (HandlerMethod) handler;
44. Method method = handlerMethod.getMethod();
45. PreventRepeat annotation = method.getAnnotation(PreventRepeat.class);
46.if(annotation !=null) {
47. // 3、 调用重复数据验证方法
48.booleanreturnValue = repeatDataValidator(request);
49.if(returnValue) {
50. //重复提交,返回JSON信息
51. response.setCharacterEncoding("UTF-8");
52. response.setContentType("application/json;charset=utf-8");
53. PrintWriter out=response.getWriter();
54. //PrintWriter out=new PrintWriter(response.getWriter());
55. Result result=newResult();
56. result.setMsgcode(SystemConstant.MSG_CODE_SUC_AGAIN);
57. result.setMessage("请不要重复提交。");
58. out.append(JSON.toJSONString(result) );
59. out.flush();
60. out.close();
61.
62.returnfalse;
63. }else{
64.returntrue;
65. }
66. }else{
67.returntrue;
68. }
69. }else{
70. // 4. 如果参数不是HandlerMethod类的实例,则调用父类的preHandle方法
71.returnsuper.preHandle(request, response, handler);
72. }
73. }
74.
75.
76. /**
77. * @Author: wRitchie
78. * @Description: repeatDataValidator 验证请求的url+请求数据参数提交是否相同
79. * 相同返回true,表示重复请求;否则返回false,表示不是重复提交
80. * @Param: [httpServletRequest]
81. * @return: boolean
82. * @Date: 2020/12/7 13:53
83. */
84.publicbooleanrepeatDataValidator(HttpServletRequest httpServletRequest) {
85.try{
86. // 1、将url+请求数据参数转换为json字符串,需pom内引用jackson-databind
87. ObjectMapper objectMapper =newObjectMapper();
88. String params = objectMapper.writeValueAsString(httpServletRequest.getParameterMap());
89. // 2、 获取当前请求的url地址,以url为key,请求数据参数为值存在map里
90. String url = httpServletRequest.getRequestURI();
91. Map map =newHashMap(4);
92. map.put(url, params);
93. String curUrlData = map.toString();
94. log.info("**** key url:"+url);
95. log.info("**** value curUrlData:"+curUrlData);
96. // 3、从session中获取上一次请求存储的url和请求数据参数字符串
97. Object preUrlData = httpServletRequest.getSession().getAttribute("preUrlData");
98. // 4、若上次请求的url+数据为null,则表示尚未访问的页面,将当前请求的url+请求数据参数存储到session中
99.if(preUrlData ==null) {
100. httpServletRequest.getSession().setAttribute("preUrlData", curUrlData);
101.returnfalse;
102. }else{
103. // 5、若上次访问的url+请求数据参数与本次url+请求数据参数相同,则表示重复提交
104.if(preUrlData.toString().equals(curUrlData)) {
105.returntrue;
106. }else{
107. //6、若上次访问的url+请求数据参数和本次url+请求数据参数不同,则不是重复提交
108. httpServletRequest.getSession().setAttribute("preUrlData", curUrlData);
109.returnfalse;
110. }
111. }
112. }catch(Exception e) {
113. log.info("验证是否为重复请求异常。");
114.returnfalse;
115. }
116. }
117. }

3、 Spring MVC 配置文件中添加配置

1.
2.
3.
4.
5.
6.
7.
8.
9.

4、 使用方法,在Controller类的方法上,增加@PreventRepeat注解


2. * @Author: wRitchie
3. * @Description: withdraw 提现
4. * @Param: [type, userId,account,payType]
5. * @return: com.bj9420.model.Result>
6. * @Date: 2020-12-07 15:15
7. */
8. @RequestMapping("/withdraw")
9. @ResponseBody
10. @PreventRepeat
11.publicResult> withdraw(String type,String userId,String account,String payType) {
12. //提现代码
13. ......
14.
15. }

5、 运行结果

这样,以拦截器的方式,SSM框架完美实现防止重复请求。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
终于,可拆卸电池手机杀回来了

终于,可拆卸电池手机杀回来了

小柱解说游戏
2024-11-20 20:15:33
好莱坞这一夜,朱莉瘦成皮包骨,63岁陈冲“一丝不露”却艳压全场

好莱坞这一夜,朱莉瘦成皮包骨,63岁陈冲“一丝不露”却艳压全场

喵喵娱乐团
2024-11-19 16:48:36
利欧股份:公司是TikTok的代理商,目前日业务规模已超百万

利欧股份:公司是TikTok的代理商,目前日业务规模已超百万

每日经济新闻
2024-11-20 16:08:18
我54岁,突然发现不生病秘诀,是养成六个好习惯,做的越好越有福

我54岁,突然发现不生病秘诀,是养成六个好习惯,做的越好越有福

荷兰豆爱健康
2024-11-19 18:32:38
市场竞争惨烈,国产DDR4芯片售价比国外竞品低50%!

市场竞争惨烈,国产DDR4芯片售价比国外竞品低50%!

芯智讯
2024-11-19 22:53:37
泰山队遭亚足联罚款,潜心备战足协杯,深受国家队比赛影响

泰山队遭亚足联罚款,潜心备战足协杯,深受国家队比赛影响

橙汁的味道123
2024-11-20 21:44:40
长腿格格移情别恋了

长腿格格移情别恋了

毒舌扒姨太
2024-11-19 22:13:48
提前看了“百万超豪”尊界S800,我觉得我要再努力一次

提前看了“百万超豪”尊界S800,我觉得我要再努力一次

品驾
2024-11-19 17:15:27
他去世了,年仅35岁……

他去世了,年仅35岁……

这里是美国
2024-11-19 13:41:46
普京女婿被富二代当众围殴,一个电话调来十几辆装甲车

普京女婿被富二代当众围殴,一个电话调来十几辆装甲车

真实故事汇
2024-11-06 13:52:55
知名“独角兽”破产!曾发布全球首款折叠屏手机,估值一度超500亿元!创始人从美国回来创业,身家曾超百亿

知名“独角兽”破产!曾发布全球首款折叠屏手机,估值一度超500亿元!创始人从美国回来创业,身家曾超百亿

鲁中晨报
2024-11-19 21:56:16
谁才是老大!美媒晒图:湖人队内最佳球员 旁边的是詹姆斯

谁才是老大!美媒晒图:湖人队内最佳球员 旁边的是詹姆斯

直播吧
2024-11-20 15:04:23
高血压还喝豆浆?医生提醒:血压高的人,这3种饮品别再碰了!

高血压还喝豆浆?医生提醒:血压高的人,这3种饮品别再碰了!

今日养生之道
2024-11-20 20:16:13
皮定均上任福州军区司令后,便对副司令陈再道说:首长,请多批评

皮定均上任福州军区司令后,便对副司令陈再道说:首长,请多批评

我是玲玲
2024-11-20 15:54:24
43岁伊万卡风韵犹存,丈夫患癌瘦到皮包骨,退出政坛后生活惬意

43岁伊万卡风韵犹存,丈夫患癌瘦到皮包骨,退出政坛后生活惬意

南城无双
2024-11-13 22:02:50
大s希望再一次落空!不死心二度拍卖豪车,却被汪前夫托关系拦下

大s希望再一次落空!不死心二度拍卖豪车,却被汪前夫托关系拦下

圈里的甜橙子
2024-11-20 21:27:42
男子花16万治病后得知:不吃药也能好

男子花16万治病后得知:不吃药也能好

鲁中晨报
2024-11-20 11:52:05
前行政长官林郑月娥,退休后因被制裁,沦落到只能在香港租房住?

前行政长官林郑月娥,退休后因被制裁,沦落到只能在香港租房住?

叹为观止易
2024-06-20 10:57:33
库里生涯20次被评为周最佳,杜兰特32次,那詹姆斯呢?

库里生涯20次被评为周最佳,杜兰特32次,那詹姆斯呢?

大卫的篮球故事
2024-11-20 17:50:54
我国或将迎来四大降价潮,除了房价以外,还有这3样东西将降价

我国或将迎来四大降价潮,除了房价以外,还有这3样东西将降价

猫叔东山再起
2024-11-18 09:50:02
2024-11-20 23:15:00
wRitchie
wRitchie
IT实用技术应用、JAVA
11文章数 12关注度
往期回顾 全部

科技要闻

钟睒睒喊话张一鸣要求道歉

头条要闻

拜登上周合影时曾迟到失去C位 疑欲与尹锡悦换位被拒

头条要闻

拜登上周合影时曾迟到失去C位 疑欲与尹锡悦换位被拒

体育要闻

踢成这样的国足,我们真心愿意付费

娱乐要闻

李玟墓地被曝杂草丛生,真相到底如何

财经要闻

马建堂:经济已筑底 2025年要充满信心

汽车要闻

电池容量增加 全新Model Y效果图曝光

态度原创

旅游
游戏
教育
手机
公开课

旅游要闻

埃及金字塔,“金字塔犬”成热门景点

上单互换!HLE正式官宣Zeus加入!

教育要闻

3分钟学会一个雅思7分句/段(第266期)

手机要闻

维信诺带领国产屏强势崛起!

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版