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