spring boot防重复提交
时间: 2023-07-25 21:03:45 浏览: 86
在Spring Boot中,可以使用Token令牌来防止重复提交。
具体实现方式如下:
1. 在前端页面中,可以使用Token令牌来防止重复提交。在表单中添加一个隐藏域,用于存储Token值。
```html
<form action="/demo" method="post">
<input type="hidden" name="token" value="${token}">
<input type="text" name="name">
<button type="submit">Submit</button>
</form>
```
2. 在Controller层方法中,判断Token是否有效,如果有效则将Token值删除,否则返回错误信息。可以通过拦截器或者AOP实现。
```java
@RestController
public class DemoController {
@PostMapping("/demo")
@TokenAnnotation // 自定义注解,用于拦截器或者AOP
public String demo(@RequestParam("token") String token) {
// do something
return "success";
}
}
```
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TokenAnnotation {
}
```
```java
@Component
public class TokenInterceptor implements HandlerInterceptor {
private static final ConcurrentHashMap<String, Object> TOKEN_MAP = new ConcurrentHashMap<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
if (method.isAnnotationPresent(TokenAnnotation.class)) {
String token = request.getParameter("token");
if (StringUtils.isBlank(token) || !TOKEN_MAP.containsKey(token)) {
throw new RuntimeException("Invalid Token!");
}
TOKEN_MAP.remove(token);
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
if (method.isAnnotationPresent(TokenAnnotation.class)) {
String token = UUID.randomUUID().toString();
TOKEN_MAP.put(token, new Object());
request.setAttribute("token", token);
}
}
}
}
```
在拦截器中,可以在preHandle方法中判断Token是否有效,如果有效则将Token值删除,否则抛出异常。在postHandle方法中,可以为每个请求生成一个新的Token值,并将其添加到请求的Attribute中。在Controller层方法中,通过自定义注解@TokenAnnotation来标识需要拦截的方法。当请求到达Controller层方法时,拦截器会对其进行拦截,判断Token是否有效。如果有效,则将Token值删除,否则抛出异常。
阅读全文