这两天用springboot和js做一个前后端分离的小项目,遇到了跨域问题
具体问题描述如下:
本地文件 register.html 中通过ajax向后台发起GET/POST请求实现一个简单的注册功能,分为两步:
- 发送手机号,获取验证码
- 填写信息,提交注册
遇到的问题是,
浏览器控制台显示:
POST http://localhost:9000/user/register/otp/code 401
Access to XMLHttpRequest at 'http://localhost:9000/user/register/otp/code'
from origin 'null' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
百度之后,大概知道是跨域问题,网上也有很多解决办法,一一尝试
第一种是从springboot1.x到2.x依旧采用的增加自定义WebMvcConfig
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 拦截所有请求
registry.addMapping("/**")
// 允许返回cookie
.allowCredentials(true)
.allowedHeaders("*")
// 允许所有来源(解决跨域问题)
.allowedOrigins("*")
.allowedMethods("*");
}
}
最终结果:没有解决
第二种方式是,使用新版springboot给出的注解
@CrossOrigin
org.springframework.web.bind.annotation.CrossOrigin
还是老样子没有解决
第三种:csdn上一篇博客给出的解决方案
此方式我并未尝试,因为在下面我找到了根本问题
第四种
我在脚本之家上看到一篇文章,博主遇到的错误和我一样,阅读完发现我也是因为引入了spring-boot-starter-security这个jar包
之所以引入它,是因为我在进行注册信息保存操作时要对密码进行加密,使用了
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
这个类(BCryptPasswordEncoder使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理, 得到密码的hash值,不可逆,盐值不同,hash解雇不同。使用SecureRandom生成的强(安全)随机数作为盐进行加密,不需要我们去记录这个盐,因为它会直接混在加密后的密码串中)
但其实,我只需要引入
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>5.2.1.RELEASE</version>
<scope>compile</scope>
</dependency>
即可,而不应该引入spring security和springboot的整合包。
到此,问题就解决了
总结:
因为我第一次遇见跨域问题,也没有阅读springboot源码,所以我对于问题的产生并不是很了解,只能先记下此次问题,给出几个解决方案,至于根本原因和底层理,之后再深入研究吧!
打赏

