关于SpringSecurity防护CSRF网上很多资料都是基于Thymeleaf(jsp)的,连官方文档也是:
但是如果是前后端分离应该怎么处理呢,也可以自己写过滤器实现,不过感觉比较麻烦;其实就算是使用Html实现也是很简单的,可以首先看看SpringSecurity防护CSRF的核心过滤器:
重点看看它的doFilterInternal()方法:
这个方法将CrsfToken存起来了,而CrsfToken也就是个很简单的接口:
再来看看到底是怎么存的呢:
也就是存在session中了,key值为静态常量DEFAULT_CSRF_TOKEN_ATTR_NAME,那前台只需要获取session中的值并保存起来,不就和使用Thymeleaf(jsp)(具体使用可参看我的另一篇博客:SpringBoot+SpringSecurity防护CSRF(基于Thymeleaf))一样了吗。但是有一个问题,session是jsp的内置对象,Html静态页面是无法直接获取session的。那就只能用别的方法(当然,也可以存在cookie里面,这样浏览器就可以获取了,具体基于cookie这篇博客说的很清楚:javascript:void(0))。
可以在SpringSecurity最终登陆成功Handler中将存在seesion中的crsfToken返回给前台:
key值是private的,那只能将值copy出来了。
先定义一个VO返回给前台:
启动项目,登陆成功后,返回:
结合我在上一篇博客(SpringBoot+SpringSecurity防护CSRF(基于Thymeleaf))中的测试页面:
值是一模一样的,只要能将这两个值传给前台,剩下的让前台每次ajax请求都执行这个方法即可: