• 一文解决浏览器跨域问题


    1. 概述

    老话说的好:大处着眼,不贪一时之利。太贪心,只会失去更多,知足才能常乐。

     

    言归正传,今天我们来聊聊 如何解决浏览器跨域的问题。

     

    2. 跨域问题

    2.1 什么是跨域

    跨域,简单说就是访问的页面域名是 www.a.com,而在此页面中 Ajax 请求接口,请求的是 www.b.com 的接口,出于安全考虑,浏览器默认不允许这样做,便会报错,提示跨域。

     

    至于为什么浏览器默认不允许跨域,允许跨域有什么安全隐患,这里就不讨论了,本文只是给大家讲讲在需要跨域的情况下,如何解决跨域问题。

     

    当然,如果访问的页面和页面中请求的接口都在一个域名下,就没有跨域的烦恼了。

     

    解决跨域问题,前端、后端都需要配置,只配置一端是不行的。

     

    2.2 使用 java 代码解决后端跨域

    新增一个跨域配置类 CrossDomainConfig,在其中配置允许跨域访问的url、请求方式、Header等。代码如下:

    复制代码
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter;
    
    @Configuration
    public class CrossDomainConfig{
    
        public CrossDomainConfig() {
    
        }
      private CorsConfiguration buildConfig() {
        
         // 添加cors配置信息
          CorsConfiguration corsConfiguration = new CorsConfiguration();
         corsConfiguration.addAllowedOrigin("http://localhost:8080");
          // * 代表所有url
            corsConfiguration.addAllowedOrigin("*");
    
            // 设置允许请求的方式
            corsConfiguration.addAllowedMethod("*");
    
            // 设置允许的header
            corsConfiguration.addAllowedHeader("*");
            
            // 设置是否发送cookie信息
            corsConfiguration.setAllowCredentials(true);
    
          return corsConfiguration;
      }
    
        @Bean
        public CorsFilter corsFilter() {
             
            // 为url添加映射路径
            UrlBasedCorsConfigurationSource crossDomainSource = new UrlBasedCorsConfigurationSource();
            crossDomainSource.registerCorsConfiguration("/**", buildConfig()); 
            
            // 返回重新定义好的配置
            return new CorsFilter(crossDomainSource); 
        } 
    }
    复制代码

     

    2.3 Nginx 解决后端跨域

    在后端接口所在的 server 配置中增加如下配置即可。

    复制代码
    # 允许跨域请求的域名,*代表所有
    add_header 'Access-Control-Allow-Origin' *;
    # 允许带上cookie请求
    add_header 'Access-Control-Allow-Credentials' 'true';
    # 允许请求的方法,例如:GET、POST、PUT、DELETE等,*代表所有
    add_header 'Access-Control-Allow-Methods' *;
    # 允许请求的头信息,例如:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent等,*代表所有
    add_header 'Access-Control-Allow-Headers' *;
    复制代码

     

    对于后端接口来说,Java代码 和 Nginx,使用其中一种方法解决跨域即可。

     

    2.3 前端 Ajax 解决跨域

    只是后端解决跨域,使用 Ajax 默认配置调用接口时,接口可以调通,但 Cookie 无法跨域携带,需要在 Ajax 调用时增加以下配置:

    crossDomain:true, //设置跨域为true
    xhrFields: {
     withCredentials: true //默认情况下,标准的跨域请求是不会发送cookie的
    },

     

    2.4 SameSite 问题 

    为了防止 CSRF 攻击和用户追踪,一些浏览器的高版本增加并默认开启了 SameSite 的机制,严格控制跨域携带 Cookie。

    Microsoft Edge 和 Google Chrome 的高版本就默认开启了 SameSite 机制。

     

    SameSite 简单说,就是浏览器在生成 Cookie 时,增加了 Cookie 的安全级别,跨域携带是不允许的。

    解决的方法有两个:

    1、登录接口在生成 Cookie 时,修改 Cookie 的 SameSite 配置,例如: httponly; secure;SameSite=None

    2、在登录接口反向代理的 Nginx 的 location 配置中增加配置:proxy_cookie_path / "/; httponly; secure;SameSite=None";

     

    注意:将 Cookie 的 SameSite 设置为 None 的前提是,接口访问协议必须是 https 的。

     

    3. 综述

    今天聊了一下 如何解决浏览器跨域的问题,希望可以对大家的工作有所帮助,下一节我们继续讲 Vue 中的高级语法,敬请期待

    欢迎帮忙点赞、评论、转发、加关注 :)

    关注追风人聊Java,这里干货满满,都是实战类技术文章,通俗易懂,轻松上手。

     

    4. 个人公众号

    追风人聊Java,欢迎大家关注

  • 相关阅读:
    Spring框架详解
    机器学习知识总结 —— 15. 什么是支持向量机(对偶问题、核技巧)?
    【软件测试】超细HttpRunner接口自动化框架使用案例,一篇策底打通...
    基于Spring Boot的职业生涯规划系统开题报告
    java.io.IOException: FIS_AUTH_ERROR in Android Firebase
    Java前后端分离的在线考试系统源码
    按规划安装配置DNS及NSX Advanced Load Balance(AVI)
    c# .net linux ImageSharp+FastDFS+Base64上传图片,压缩图片大小,图像处理dcoker中使用也可以
    SPDK LVOL +Blobstore +FIO 使用
    强大博客搭建全过程(1)-hexo博客搭建保姆级教程
  • 原文地址:https://www.cnblogs.com/w84422/p/16183346.html