Ajax+SpringBoot前后端分离,解决session跨域问题

Scroll Down

这两天用springboot和js做一个前后端分离的小项目,遇到了跨域问题

具体问题描述如下:

本地文件 register.html 中通过ajax向后台发起GET/POST请求实现一个简单的注册功能,分为两步:

  1. 发送手机号,获取验证码
  2. 填写信息,提交注册

遇到的问题是,

浏览器控制台显示:

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源码,所以我对于问题的产生并不是很了解,只能先记下此次问题,给出几个解决方案,至于根本原因和底层理,之后再深入研究吧!