JAVA全系列 教程
3762个小节阅读:7088.8k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
xxxxxxxxxx
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
xxxxxxxxxx
spring.redis.host=localhost
spring.redis.port=6379
即添加了该注解的接口要实现幂等性验证。
xxxxxxxxxx
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiIdempotentAnn {
boolean value() default true;
}
xxxxxxxxxx
/**
* 跳转注册页面
* @return
*/
@GetMapping("/toAddUser")
public ModelAndView adduser(){
ModelAndView modelAndView = new ModelAndView();
// 生成Token
String s = UUID.randomUUID().toString();
// 保存redis
stringRedisTemplate.opsForValue().set(s,Thread.currentThread().getId()+"");
modelAndView.setViewName("addUser");
modelAndView.addObject("token",s);
return modelAndView;
}
xxxxxxxxxx
package com.itbaizhan.idempotentdemo.config;
import com.itbaizhan.idempotentdemo.ApiIdempotentAnn;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.lang.reflect.Method;
@Component
public class ApiIdempotentInceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
*表示在所有请求之前完成的拦截,一般使用居多
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return true;
}
final HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取方法
final Method method = handlerMethod.getMethod();
// 判断有没有添加需要幂等性注解
boolean methodAnn = method.isAnnotationPresent(ApiIdempotentAnn.class);
// 判断是否开启幂等性严重
if (methodAnn && method.getAnnotation(ApiIdempotentAnn.class).value()) {
// 需要实现接口幂等性
boolean result = checkToken(request);
if (result) {
return true;
} else {
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("重复调用");
writer.close();
response.flushBuffer();
return false;
}
}
return false;
}
private boolean checkToken(HttpServletRequest request) {
String token = request.getParameter("token");
if (null == token || "".equals(token)) {
// 没有token,说明重复调用或者
return false;
}
// 返回是否删除成功
return stringRedisTemplate.delete(token);
}
}
WebMvcConfigurer配置类其实是Spring
内部的一种配置方式,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter等等的东西对springmvc框架进行配置。
xxxxxxxxxx
package com.itbaizhan.idempotentdemo.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private ApiIdempotentInceptor apiIdempotentInceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> list=new ArrayList<String>();
list.add("/user/toAddUser");
list.add("/user/index");
registry.addInterceptor(apiIdempotentInceptor).excludePathPatterns(list);
}
}
接口幂等性设计_insert操作幂等性实现_下