之前用的是 spring MVC 模式 post请求,一直畅通无阻
结果用了 spring boot 和 springSecurity 后 ,不知道 post请求会被拦截
试了好多遍都不通过。
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,
通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。
例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚
发布了一个具有Bob银行链接的图片消息。
设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的
链接,并将此链接作为图片src。
如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当
Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事
务。
springSecurity 是会对 post请求进行验证的
可以有两种方法进行设置通过,
解决办法一、
配置中加入排除csrf的地址
private CsrfSecurityRequestMatcher csrfSecurityRequestMatcher() {
CsrfSecurityRequestMatcher csrfSecurityRequestMatcher = new CsrfSecurityRequestMatcher();
List<String> list = new ArrayList<String>();
list.add("/druid");
list.add("/upload");
list.add("/ueditorcontrol");
csrfSecurityRequestMatcher.setExecludeUrls(list);
return csrfSecurityRequestMatcher;
}
解决办法二、
AJAX请求发送前执行函数。Ajax事件。
XMLHttpRequest对象和设置作为参数传递给回调函数
$(document).ajaxSend(function(evt,request,settings){})是全局事件,也就是说,
只要该页面定义了这个函数,那么,在每个ajax请求前都会执行该函数
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
前后端分离请求流程
1. 登录成功,返回token给前端(前后端分离架构);
2. 创建CsrfFilter,对非登录的post请求,验证其token是否正确;
3. 注册CSRFFilter
4. 如有需要,可在token使用后刷新或前端控制使用旧token换取新token。