SpringBoot解决跨域问题

发布于 2022-03-11  1.57k 次阅读


一,同源策略(原因)

   同源策略本质上是一种由Netscape公司引入浏览器的一种保护策略,它是所有浏览器和WEB服务器都遵循的约定,当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,同源服务器可以直接正常访问目标资源,非同源服务器无法正常直接访问目标资源,会报跨域问题

同源标准:协议,域名(IP),端口三者相同即为同源

同源策略的目的:保证用户信息的安全,防止不良网站对资源的恶意窃取

非同源的限制:

  1. 无法获取非同源网页的DOM信息
  2. 无法读取非同源的Session,Cookie等响应头信息
  3. 向非同源地址发送AJAX请求目标资源,会出现拒绝访问和跨域错误

注:本质上无同源就无跨域

同源的判断:是否同源判断协议,域名(IP),端口三要素

URL1 URL2 说明 是否同源
http://wql.luoqin.ltd/nginx/wql.html http://wql.luoqin.ltd/nginx/fq.html 协议,域名,端口(默认80)都相同
http://wql.luoqin.ltd/nginx http://wql.luoqin.ltd:6666/nginx 协议,域名相同,端口不同
http://wql.luoqin.ltd/nginx https://wql.luoqin.ltd/nginx 域名,端口相同,协议不同
http://wql.luoqin.ltd/nginx http://fq.luoqin.ltd/nginx 协议,端口相同,域名不同
http://wql.luoqin.ltd/nginx http://luoqin.ltd/nginx 协议,端口相同,主域名相同,子域名不同

二,SpringBoot解决跨域问题

SpringBoot通过CORS(Cross Origin Resource Sharing)跨域资源共享策略进行解决,本质上就是在Http头部添加一些参数,让浏览器知道该请求进行跨域处理

SpringBoot有三种方式解决跨域问题:

  1. @CrossOrigin注解
  2. 使用CORS过滤器
  3. 实现WebMvcConfigure接口,重写addCorsMappings方法

一,@CrossOrigin注解

该注解可以标注范围:

  • @Controll类上:表示该类上的所以映射方法都进行共享
  • @RequestMapping方法上:表示只有该方法进行共享

@CrossOrigin注解可以把粒度做的很细,但是有大批量的请求需要进行跨域时就不太合适,一个个标注太麻烦

例:

@Controller
public class wqltext {


    @Autowired
    CrossDomain crossDomain;


    @RequestMapping(value = "/home",method = RequestMethod.GET)
    @CrossOrigin
    public CrossDomain getwql(){
        crossDomain.setCode(200);
        crossDomain.setId(1);
        crossDomain.setName("fq");
        crossDomain.setAge(19);
        return crossDomain;
    }
}

二,CORS过滤器

通过配置Cors过滤器批量配置跨域

CorsConfiguration跨域配置类:

  • addAllowedOrigin():允许哪些域请求来访问
  • addAllowedHeader():请求的Header头字段
  • addAllowedMethod():允许的请求方式
  • ……

UrlBasedCorsConfigurationSource映射配置类:

  • registerCorsConfiguration():拦截的路径
  • ……

例:

@Configuration
public class CorsConfig {
        @Bean
        public CorsFilter corsFilter(){
                
                CorsConfiguration corsConfiguration = new CorsConfiguration();
                corsConfiguration.addAllowedOrigin("*");
                corsConfiguration.addAllowedHeader("*");
                corsConfiguration.addAllowedMethod("*");
                
                UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
                source.registerCorsConfiguration("/**",corsConfiguration);
                return new CorsFilter(source);
        }


}

三,实现WebMvcConfigure接口重写addCorsMappings方法

本质上和Cors过滤器一样,但这种方式配置比Cors过滤器简单,是SpringBoot跨域最常见的方式

例:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**")//路径
                .allowedOrigins("*")
                .allowedHeaders("*")
                .allowedMethods("*")
                .allowCredentials(true)//是否允许携带Cookie
                .maxAge(360);//设置有效期,表示一个域外请求通过在有效期内都可以直接访问不需要调用该方法进行效验,以秒为单位

    }
}

路漫漫其修远兮,吾将上下而求索