本文先上遇到的坑。后续会添加搭建!搭建很简单,去网上复制就行。
首先为什么要集成SpringSecurity?我的项目是Http会话即单次握手。每次访问接口需要验证用户令牌(token,请求头获取)
首先博主集成SpringSecurity之后跨域失败!(这里指的是没有配置nginx情况下)
因为CORS请求是两次,一次是确定信息,一次是传递。那么第一次一定是没有token的!那么就要放行,所以Security就要关闭防护!
.and() //一个拦截组的结尾
.csrf().disable(); // 关闭csrf防护
因为楼主设置的Security的过滤链条是顶级链。还没有通过我们配置的跨域拦截器(即使你设置的过滤链等级为0)就已经返回前端。那么是不是就没有跨域了?是的!
在开发过程中遇到CORS
(跨域资源共享) 的问题,简单的在服务器端设置了允许跨域访问,但是在携带jwt请求过程中出现
那么根据这样的思路,是不是可以在SpringSecurity设置跨域?是的!
就在链条种and一个规则:
http.cors().and().csrf().disable().authorizeRequests()
//处理跨域请求中的Preflight请求(cors)
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
.anyRequest().authenticated();
我们都知道浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求,像XMLHttpRequest和Fetch都遵循同源策略。
浏览器限制发起跨域请求 跨域请求可以正常发起,但是返回的结果被浏览器拦截了,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。
场景:需要跨域向数据库score字段+100,请求成功。但是页面不显示,我又再点了一次。。。GG
为了防止这种情况的发生,规范要求,对这种可能对服务器数据产生副作用的HTTP请求方法,浏览器必须先使用OPTIONS方法发起一个预检请求,从而获知服务器是否允许该跨域请求:如果允许,就发送带数据的真实请求;如果不允许,则阻止发送带数据的真实请求。