403跨域,什么是跨域,如何解决。(CROS)

一、出现跨域的原因

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。

二、什么是跨域

当请求的协议域名端口,任一不相同时就会出现跨域。

举个例子:

当前URL 被请求URL 是否跨域 原因
http://www.abc.com/index http://www.abc.com/info 同源(协议、域名、端口都相同)
http://www.abc.com/index https://www.abc.com/index 协议不同(http/https)
http://www.abc.com/index http://www.def.com/index 域名不同(www.abc.com/www.def.com)
http://www.abc.com/index:8080 http://www.abc.com/index:8181 端口不同(8080/8181)

三、非同源限制

不能获取不同源的 cookie,LocalStorage 和 indexDB

不能获取不同源的 DOM()

不能发送不同源的 ajax 请求 (可以向不同源的服务器发起请求,但是返回的数据会被浏览器拦截)

四、如何解决跨域

解决跨域,将使用到CROS,cross-origin resource sharing,跨域资源共享。

以下有几种解决方法:

1、使用注解@CrossOrigin,可以放在需要进行跨域请求的controller类上或者指定的方法上。

2、添加设置过滤器。

  @Bean
  public CorsWebFilter corsWebFilter(){
    // cors跨域配置对象
    CorsConfiguration configuration = new CorsConfiguration();
    //设置允许访问的网络
    configuration.addAllowedOrigin("*");
    // 设置是否从服务器获取cookie
    configuration.setAllowCredentials(true);
    // 设置请求方法 * 表示任意
    configuration.addAllowedMethod("*");
    // 所有请求头信息 * 表示任意
    configuration.addAllowedHeader("*");
    // 有效期3600秒
    configuration.setMaxAge(3600L);

    // 配置源对象
    UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();
    configurationSource.registerCorsConfiguration("/**", configuration);
    // cors过滤器对象
    return new CorsWebFilter(configurationSource);
  }
 
 
 
//或者
 
 
 
@Configuration
public class CorsConfig {
  private CorsConfiguration buildConfig() {
    CorsConfiguration corsConfiguration = new CorsConfiguration();
    // session 多次访问一致
    corsConfiguration.setAllowCredentials(true);

    // 允许访问的客户端域名
    corsConfiguration.addAllowedOrigin("*"); // 允许任何域名使用
    corsConfiguration.addAllowedHeader("*"); // 允许任何头
    corsConfiguration.addAllowedMethod("*"); // 允许任何方法(post、get等)
    return corsConfiguration;
  }

  @Bean
  public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", buildConfig()); // 对接口配置跨域设置
    return new CorsFilter((CorsConfigurationSource) source);
  }
}

3、直接实现 WebMvcConfigurer 接口

@Configuration
public class CorsConfig1 implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry
        //设置允许跨域访问的路径
        .addMapping("/**")
        //是否发送 cookie
        .allowCredentials(true)
        //设置允许跨域访问的源
        .allowedOrigins("*")
        //设置允许请求方式
        .allowedMethods(new String[] {"GET", "POST", "PUT", "DELETE"})
        //允许头部设置
        .allowedHeaders("*")
        //允许响应头部
        .exposedHeaders("*");
  }
}

你可能感兴趣的:(java优秀例子,java,网络)