订单幂等性
1、联合唯一索引,进行去重复;用户id+商品id建立唯一索引。
2、通过状态机保证接口幂等;后端可以根据不同的状态去保证幂等性,比如在退款的时候,一定要保证这笔订单是已支付的状态。
3、TOKEN机制,针对客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用Token的机制实现防止重复提交。TOKEN机制如何实现?简单的说就是调用方在调用接口的时候先向后端请求一个全局ID(TOKEN),请求的时候携带这个全局ID一起请求,后端需要对这个全局ID校验来保证幂等操作
把幂等校验操作封装成一个注解来处理。
如何把幂等操作封装成一个注解来使用?“请勿重复请求”
true表示第一次提交,false重复提交;
1、定义注解
2、在某个方法上使用注解;
3、SpringBoot之HandlerInterceptor拦截器;
1、定义实现类
定义一个Interceptor 非常简单方式也有几种,我这里简单列举两种
1)类要实现Spring 的HandlerInterceptor 接口
2)类继承实现了HandlerInterceptor 接口的类,例如 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter;
1、preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
2、postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView (这个博主就基本不怎么用了);
3、afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
拦截器实现
新建WebAppConfigurer 实现WebMvcConfigurer接口;
其实以前都是继承WebMvcConfigurerAdapter类 不过springBoot2.0以上 WebMvcConfigurerAdapter 方法过时,有两种替代方案:
1、继承WebMvcConfigurationSupport
2、实现WebMvcConfigurer
但是继承WebMvcConfigurationSupport会让Spring-boot对mvc的自动配置失效。根据项目情况选择。现在大多数项目是前后端分离,并没有对静态资源有自动配置的需求所以继承WebMvcConfigurationSupport也未尝不可。
对请求添加拦截器,拦截规则是所有请求。可以打印出所有的请求信息。
registry.addInterceptor(new TestFilter()).addPathPatterns("/**");