面试中如何高效解决跨域问题?

2026-05-24 02:071阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1807个文字,预计阅读时间需要8分钟。

面试中如何高效解决跨域问题?

目录 + 1. 跨域三种情况 + 2. 跨域问题演示 + 2.1 前端网站 + 2.2 后端接口 + 3. 解决跨域问题 + 3.1 通过注解跨域 + 3.2 通过配置文件跨域 + 3.3 通过CorsFilter跨域 + 3.4 通过Response跨域 + 3.5 通过ResponseBodyAdvic跨域

目录
  • 1.跨域三种情况
  • 2.跨域问题演示
    • 2.1 前端网站
    • 2.2 后端接口
  • 3.解决跨域问题
    • 3.1 通过注解跨域
    • 3.2 通过配置文件跨域
    • 3.3 通过 CorsFilter 跨域
    • 3.4 通过 Response 跨域
    • 3.5 通过 ResponseBodyAdvice 跨域
  • 4.原理分析
    • 演示项目源码
  • 总结

    跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。 但这个保护机制也带来了新的问题,它的问题是给不同站点之间的正常调用,也带来的阻碍,那怎么解决这个问题呢?接下来我们一起来看。

    1.跨域三种情况

    在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求:

    • 协议不同,如 localhost:9090/test", type: "POST", data: {"name": "Java"}, success: function (result) { alert("返回数据:" + result.data); } }); } </script> </body> </html> 复制代码

      2.2 后端接口

      后端接口项目首先先在 application.properties 配置文件中,设置项目的端口号为 9090,如下所示:

      server.port=9090

      然后创建一个后端控制器,返回一个 JSON 格式的数据,实现代码如下:

      import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; @RestController public class TestController { @RequestMapping("/test") public HashMap<String, Object> test() { return new HashMap<String, Object>() {{ put("state", 200); put("data", "success"); put("msg", ""); }}; } }

      以上两个项目创建并启动成功之后,使用前端项目访问后端接口,因为端口不一样,所以也属于跨域访问,运行结果如下图所示:

      3.解决跨域问题

      在 Spring Boot 中跨域问题有很多种解决方案,比如以下 5 个:

      • 使用 @CrossOrigin 注解实现跨域;
      • 通过配置文件实现跨域;
      • 通过 CorsFilter 对象实现跨域;
      • 通过 Response 对象实现跨域;
      • 通过实现 ResponseBodyAdvice 实现跨域。

      当然如果你愿意的话,还可以使用过滤器来实现跨域,但它的实现和第 5 种实现类似,所以本文就不赘述了。

      3.1 通过注解跨域

      使用 @CrossOrigin 注解可以轻松的实现跨域,此注解既可以修饰类,也可以修饰方法。当修饰类时,表示此类中的所有接口都可以跨域;当修饰方法时,表示此方法可以跨域,它的实现如下:

      import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; @RestController @CrossOrigin(origins = "*") public class TestController { @RequestMapping("/test") public HashMap<String, Object> test() { return new HashMap<String, Object>() {{ put("state", 200); put("data", "success"); put("msg", ""); }}; } }

      以上代码的执行结果如下图所示:

      从上图中可以看出,前端项目访问另一个后端项目成功了,也就说明它解决了跨域问题。 优缺点分析 此方式虽然虽然实现(跨域)比较简单,但细心的朋友也能发现,使用此方式只能实现局部跨域,当一个项目中存在多个类的话,使用此方式就会比较麻烦(需要给所有类上都添加此注解)。

      3.2 通过配置文件跨域

      接下来我们通过设置配置文件的方式就可以实现全局跨域了,它的实现步骤如下:

      面试中如何高效解决跨域问题?

      • 创建一个新配置文件;
      • 添加 @Configuration 注解,实现 WebMvcConfigurer 接口;
      • 重写 addCorsMappings 方法,设置允许跨域的代码。

      具体实现代码如下:

      import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration // 一定不要忽略此注解 public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 所有接口 .allowCredentials(true) // 是否发送 Cookie .allowedOriginPatterns("*") // 支持域 .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法 .allowedHeaders("*") .exposedHeaders("*"); } }

      3.3 通过 CorsFilter 跨域

      此实现方式和上一种实现方式类似,它也可以实现全局跨域,它的具体实现代码如下:

      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 MyCorsFilter { @Bean public CorsFilter corsFilter() { // 1.创建 CORS 配置对象 CorsConfiguration config = new CorsConfiguration(); // 支持域 config.addAllowedOriginPattern("*"); // 是否发送 Cookie config.setAllowCredentials(true); // 支持请求方式 config.addAllowedMethod("*"); // 允许的原始请求头部信息 config.addAllowedHeader("*"); // 暴露的头部信息 config.addExposedHeader("*"); // 2.添加地址映射 UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource(); corsConfigurationSource.registerCorsConfiguration("/**", config); // 3.返回 CorsFilter 对象 return new CorsFilter(corsConfigurationSource); } }

      3.4 通过 Response 跨域

      此方式是解决跨域问题最原始的方式,但它可以支持任意的 Spring Boot 版本(早期的 Spring Boot 版本也是支持的)。但此方式也是局部跨域,它应用的范围最小,设置的是方法级别的跨域,它的具体实现代码如下:

      import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.gitee.com/mydb/springboot-examples/tree/master/spring-boot-cross

      总结

      跨域问题的本质是浏览器为了保证用户的一种安全拦截机制,想要解决跨域问题,只需要告诉浏览器“我是自己人,不要拦我”就行。它的常见实现方式有 5 种:通过注解实现局部跨域、通过配置文件实现全局跨域、通过 CorsFilter 对象实现全局跨域、通过 Response 对象实现局部跨域,通过 ResponseBodyAdvice 实现全局跨域。

      到此这篇关于面试突击之跨域问题的解决方案详解的文章就介绍到这了,更多相关跨域问题内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

    本文共计1807个文字,预计阅读时间需要8分钟。

    面试中如何高效解决跨域问题?

    目录 + 1. 跨域三种情况 + 2. 跨域问题演示 + 2.1 前端网站 + 2.2 后端接口 + 3. 解决跨域问题 + 3.1 通过注解跨域 + 3.2 通过配置文件跨域 + 3.3 通过CorsFilter跨域 + 3.4 通过Response跨域 + 3.5 通过ResponseBodyAdvic跨域

    目录
    • 1.跨域三种情况
    • 2.跨域问题演示
      • 2.1 前端网站
      • 2.2 后端接口
    • 3.解决跨域问题
      • 3.1 通过注解跨域
      • 3.2 通过配置文件跨域
      • 3.3 通过 CorsFilter 跨域
      • 3.4 通过 Response 跨域
      • 3.5 通过 ResponseBodyAdvice 跨域
    • 4.原理分析
      • 演示项目源码
    • 总结

      跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。 但这个保护机制也带来了新的问题,它的问题是给不同站点之间的正常调用,也带来的阻碍,那怎么解决这个问题呢?接下来我们一起来看。

      1.跨域三种情况

      在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求:

      • 协议不同,如 localhost:9090/test", type: "POST", data: {"name": "Java"}, success: function (result) { alert("返回数据:" + result.data); } }); } </script> </body> </html> 复制代码

        2.2 后端接口

        后端接口项目首先先在 application.properties 配置文件中,设置项目的端口号为 9090,如下所示:

        server.port=9090

        然后创建一个后端控制器,返回一个 JSON 格式的数据,实现代码如下:

        import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; @RestController public class TestController { @RequestMapping("/test") public HashMap<String, Object> test() { return new HashMap<String, Object>() {{ put("state", 200); put("data", "success"); put("msg", ""); }}; } }

        以上两个项目创建并启动成功之后,使用前端项目访问后端接口,因为端口不一样,所以也属于跨域访问,运行结果如下图所示:

        3.解决跨域问题

        在 Spring Boot 中跨域问题有很多种解决方案,比如以下 5 个:

        • 使用 @CrossOrigin 注解实现跨域;
        • 通过配置文件实现跨域;
        • 通过 CorsFilter 对象实现跨域;
        • 通过 Response 对象实现跨域;
        • 通过实现 ResponseBodyAdvice 实现跨域。

        当然如果你愿意的话,还可以使用过滤器来实现跨域,但它的实现和第 5 种实现类似,所以本文就不赘述了。

        3.1 通过注解跨域

        使用 @CrossOrigin 注解可以轻松的实现跨域,此注解既可以修饰类,也可以修饰方法。当修饰类时,表示此类中的所有接口都可以跨域;当修饰方法时,表示此方法可以跨域,它的实现如下:

        import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; @RestController @CrossOrigin(origins = "*") public class TestController { @RequestMapping("/test") public HashMap<String, Object> test() { return new HashMap<String, Object>() {{ put("state", 200); put("data", "success"); put("msg", ""); }}; } }

        以上代码的执行结果如下图所示:

        从上图中可以看出,前端项目访问另一个后端项目成功了,也就说明它解决了跨域问题。 优缺点分析 此方式虽然虽然实现(跨域)比较简单,但细心的朋友也能发现,使用此方式只能实现局部跨域,当一个项目中存在多个类的话,使用此方式就会比较麻烦(需要给所有类上都添加此注解)。

        3.2 通过配置文件跨域

        接下来我们通过设置配置文件的方式就可以实现全局跨域了,它的实现步骤如下:

        面试中如何高效解决跨域问题?

        • 创建一个新配置文件;
        • 添加 @Configuration 注解,实现 WebMvcConfigurer 接口;
        • 重写 addCorsMappings 方法,设置允许跨域的代码。

        具体实现代码如下:

        import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration // 一定不要忽略此注解 public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 所有接口 .allowCredentials(true) // 是否发送 Cookie .allowedOriginPatterns("*") // 支持域 .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法 .allowedHeaders("*") .exposedHeaders("*"); } }

        3.3 通过 CorsFilter 跨域

        此实现方式和上一种实现方式类似,它也可以实现全局跨域,它的具体实现代码如下:

        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 MyCorsFilter { @Bean public CorsFilter corsFilter() { // 1.创建 CORS 配置对象 CorsConfiguration config = new CorsConfiguration(); // 支持域 config.addAllowedOriginPattern("*"); // 是否发送 Cookie config.setAllowCredentials(true); // 支持请求方式 config.addAllowedMethod("*"); // 允许的原始请求头部信息 config.addAllowedHeader("*"); // 暴露的头部信息 config.addExposedHeader("*"); // 2.添加地址映射 UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource(); corsConfigurationSource.registerCorsConfiguration("/**", config); // 3.返回 CorsFilter 对象 return new CorsFilter(corsConfigurationSource); } }

        3.4 通过 Response 跨域

        此方式是解决跨域问题最原始的方式,但它可以支持任意的 Spring Boot 版本(早期的 Spring Boot 版本也是支持的)。但此方式也是局部跨域,它应用的范围最小,设置的是方法级别的跨域,它的具体实现代码如下:

        import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.gitee.com/mydb/springboot-examples/tree/master/spring-boot-cross

        总结

        跨域问题的本质是浏览器为了保证用户的一种安全拦截机制,想要解决跨域问题,只需要告诉浏览器“我是自己人,不要拦我”就行。它的常见实现方式有 5 种:通过注解实现局部跨域、通过配置文件实现全局跨域、通过 CorsFilter 对象实现全局跨域、通过 Response 对象实现局部跨域,通过 ResponseBodyAdvice 实现全局跨域。

        到此这篇关于面试突击之跨域问题的解决方案详解的文章就介绍到这了,更多相关跨域问题内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!