java实现csrf token的生成来防止表单重复提交
时间: 2024-10-26 07:03:38 浏览: 15
自定义标签防止表单重复提交
3星 · 编辑精心推荐
在Java中,CSRF (Cross-Site Request Forgery) 通常通过生成一个随机的Token(也称为CSRF Token或安全令牌)来防止恶意表单提交。下面是一个简单的步骤来实现:
1. **服务器端生成Token**:
- 当用户首次访问需要保护的页面时,服务器会在Session、Cookie或隐藏表单字段(如`<input type="hidden" name="csrf_token">`)中生成一个唯一的CSRF Token。
- 这个Token通常是基于当前时间戳、随机数和用户的唯一标识(如登录用户ID)生成的哈希值。
```java
import javax.servlet.http.HttpSession;
import org.springframework.web.util.WebUtils;
// 例子在一个Spring MVC控制器
HttpSession session = WebUtils.getHttpSession(request);
String csrfToken = UUID.randomUUID().toString(); // 使用UUID或其他随机算法
session.setAttribute("csrfToken", csrfToken);
```
2. **将Token发送给客户端**:
- 将生成的Token附加到响应中返回给前端,比如在设置Cookie的时候带上。
3. **验证Token**:
- 用户提交表单时,前端会携带这个Token一起发送回服务器。
- 服务器在接收到请求后,首先检查请求头、Cookie或表单字段中的Token是否匹配已保存在Session中的Token。
```java
String submittedToken = request.getParameter("csrf_token");
if (!Objects.equals(submittedToken, session.getAttribute("csrfToken"))) {
throw new InvalidCsrfException("CSRF token is invalid");
}
```
4. **处理Token过期**:
- 为了增加安全性,可以在一段时间后自动清除Token,或者在用户登出后清除Token。
阅读全文