关于SpringSecurity防护CSRF网上很多资料都是基于Thymeleaf(jsp)的,连官方文档也是:

SpringBoot+SpringSecurity防护CSRF(基于Html)_ajax

但是如果是前后端分离应该怎么处理呢,也可以自己写过滤器实现,不过感觉比较麻烦;其实就算是使用Html实现也是很简单的,可以首先看看SpringSecurity防护CSRF的核心过滤器:

SpringBoot+SpringSecurity防护CSRF(基于Html)_静态页面_02

重点看看它的doFilterInternal()方法:

SpringBoot+SpringSecurity防护CSRF(基于Html)_静态页面_03

这个方法将CrsfToken存起来了,而CrsfToken也就是个很简单的接口:

SpringBoot+SpringSecurity防护CSRF(基于Html)_内置对象_04

再来看看到底是怎么存的呢:

SpringBoot+SpringSecurity防护CSRF(基于Html)_ajax_05

也就是存在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(基于Html)_静态页面_06

SpringBoot+SpringSecurity防护CSRF(基于Html)_静态页面_07

启动项目,登陆成功后,返回:

SpringBoot+SpringSecurity防护CSRF(基于Html)_静态页面_08

结合我在上一篇博客(​​SpringBoot+SpringSecurity防护CSRF(基于Thymeleaf)​​)中的测试页面:

SpringBoot+SpringSecurity防护CSRF(基于Html)_内置对象_09

值是一模一样的,只要能将这两个值传给前台,剩下的让前台每次ajax请求都执行这个方法即可:

SpringBoot+SpringSecurity防护CSRF(基于Html)_静态页面_10