当前位置:   article > 正文

Spring Boot如何解决跨域问题?

Spring Boot如何解决跨域问题?

1.什么是跨域?

跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样。说白了就是ip、网络协议、端口都一样的时候,就是同一个域,否则就是跨域。这是由于Netscape提出一个著名的安全策略——同源策略造成的,这是浏览器对JavaScript施加的安全限制。是防止外网的脚本恶意攻击服务器的一种措施。

2.代码工程

实验目标

让Spring Boot应用支持跨域

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springboot-demo</artifactId>
  7. <groupId>com.et</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cors</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-autoconfigure</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. </dependencies>
  31. </project>

第一种跨域解决方法

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

  1. package com.et.cors.controller;
  2. import org.springframework.web.bind.annotation.*;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. @RestController
  6. public class HelloWorldController {
  7. //@CrossOrigin
  8. @GetMapping("/hello")
  9. public String hello() {
  10. System.out.println("get hello");
  11. return "get hello";
  12. }
  13. @CrossOrigin
  14. @PostMapping("/hello")
  15. public String hello2() {
  16. System.out.println("post hello");
  17. return "post hello";
  18. }
  19. }

第二种跨域解决方法

通过 CorsFilter 跨域,“*”代表全部。”**”代表适配所有接口。  其中addAllowedOrigin(String origin)方法是追加访问源地址。如果不使用”*”(即允许全部访问源),则可以配置多条访问源来做控制。 例如:

config.addAllowedOrigin("http://www.liuhaihua.cn/"); 
config.addAllowedOrigin("http://test.liuhaihua.cn/");
  1. package com.et.cors.filter;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.cors.CorsConfiguration;
  5. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  6. import org.springframework.web.filter.CorsFilter;
  7. @Configuration
  8. public class MyCorsFilter {
  9. @Bean
  10. public CorsFilter corsFilter() {
  11. CorsConfiguration config = new CorsConfiguration();
  12. config.addAllowedOrigin("*");
  13. config.setAllowCredentials(true);
  14. config.addAllowedMethod("*");
  15. config.addAllowedHeader("*");
  16. UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
  17. corsConfigurationSource.registerCorsConfiguration("/**", config);
  18. return new CorsFilter(corsConfigurationSource);
  19. }
  20. }

第三种跨域解决方法

重写 WebMvcConfigurer

  1. package com.et.cors.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.CorsRegistry;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  5. @Configuration
  6. public class WebConfig implements WebMvcConfigurer {
  7. @Override
  8. public void addCorsMappings(CorsRegistry registry) {
  9. registry.addMapping("/**")
  10. .allowCredentials(true)
  11. .allowedOrigins("*")
  12. .allowedMethods("GET", "POST", "PUT", "DELETE")
  13. .allowedHeaders("*");
  14. }
  15. }

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
  8. <script>
  9. function btnClick() {
  10. $.get('http://localhost:8088/hello', function (msg) {
  11. $("#app").html(msg);
  12. });
  13. }
  14. function btnClick2() {
  15. $.post('http://localhost:8088/hello', function (msg) {
  16. $("#app").html(msg);
  17. });
  18. }
  19. </script>
  20. <body>
  21. <div id="app"></div>
  22. <input type="button" onclick="btnClick()" value="get_button">
  23. <input type="button" onclick="btnClick2()" value="post_button">
  24. </body>
  25. </html>

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

3.测试

请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
  • 启动Spring Boot应用
  • 访问http://127.0.0.1:8088/index.html
  • 点击第一个按钮,出现跨域问题
Access to XMLHttpRequest at 'http://localhost:8088/hello' from origin 'http://127.0.0.1:8088' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  • 点击第二个按钮,添加注解@CrossOrigin,未出现跨域

4.引用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/1022098
推荐阅读
相关标签
  

闽ICP备14008679号