SpringBoot-SpringSecurity跨域,java设置跨域失败

本文先上遇到的坑。后续会添加搭建!搭建很简单,去网上复制就行。

首先为什么要集成SpringSecurity?我的项目是Http会话即单次握手。每次访问接口需要验证用户令牌(token,请求头获取)

首先博主集成SpringSecurity之后跨域失败!(这里指的是没有配置nginx情况下

因为CORS请求是两次,一次是确定信息,一次是传递。那么第一次一定是没有token的!那么就要放行,所以Security就要关闭防护!

.and()                                             //一个拦截组的结尾 
.csrf().disable();                             // 关闭csrf防护

因为楼主设置的Security的过滤链条是顶级链。还没有通过我们配置的跨域拦截器(即使你设置的过滤链等级为0)就已经返回前端。那么是不是就没有跨域了?是的!

在开发过程中遇到CORS (跨域资源共享) 的问题,简单的在服务器端设置了允许跨域访问,但是在携带jwt请求过程中出现

并且没有对Preflight这个请求做出相应的处理,那么这个请求会导致权限管控失败。

那么根据这样的思路,是不是可以在SpringSecurity设置跨域?是的!

就在链条种and一个规则:

http.cors().and().csrf().disable().authorizeRequests()
        //处理跨域请求中的Preflight请求(cors)
        .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
        .anyRequest().authenticated();

preflight request

我们都知道浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求,像XMLHttpRequest和Fetch都遵循同源策略。

浏览器限制发起跨域请求 跨域请求可以正常发起,但是返回的结果被浏览器拦截了,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。

场景:需要跨域向数据库score字段+100,请求成功。但是页面不显示,我又再点了一次。。。GG

为了防止这种情况的发生,规范要求,对这种可能对服务器数据产生副作用的HTTP请求方法,浏览器必须先使用OPTIONS方法发起一个预检请求,从而获知服务器是否允许该跨域请求:如果允许,就发送带数据的真实请求;如果不允许,则阻止发送带数据的真实请求。

你可能感兴趣的:(SpringBoot-SpringSecurity跨域,java设置跨域失败)