1. 程式人生 > 其它 >SpringBoot - 解決跨域請求問題

SpringBoot - 解決跨域請求問題

技術標籤:SpringBootCORS跨域ajax跨域問題

現在專案開發中,前後端分離越來越流行了,但在前後端分離通過 Ajax訪問時會存在一個跨域的問題。即由於瀏覽器的安全性限制,不允許AJAX訪問協議不同、域名不同、埠號不同的資料介面,否則會出報No 'Access-Control-Allow-Origin' header is present on the requested resource.錯誤。如下所示:

強大的 Spring Boot支援通過設定CORS(跨源資源共享)來解決跨域請求問題。具體如下幾種方式可以進行配置,我們選擇一種即可。

1、通過註解的方式

(1)、在請求方法上添加註解 @CrossOrigin

說明此方法支援跨域

@Controller
public class UserController {

    @GetMapping("/user")
    @ResponseBody
    @CrossOrigin
    public User user(){
        User user = new User();
        user.setPassword("123456");
        user.setUsername("admin");
        user.setRegister(LocalDateTime.now());
        return user;
    }
}

(2)、在控制類上添加註解 @CrossOrigin,相當於所有的方法都支援跨域,

@Controller
@CrossOrigin
public class UserController {

    @GetMapping("/user")
    @ResponseBody
    public User user(){
        User user = new User();
        user.setPassword("123456");
        user.setUsername("admin");
        user.setRegister(LocalDateTime.now());
        return user;
    }
}

(3)、@CrossOrigin註解引數配置:

  • value:表示支援的域。這裡表示來自http://localhost:8081域的請求是支援跨域的。預設為*,表示所有域都可以。
  • maxAge:表示探測請求的有效期(先進性判斷是否有效)。探測請求不用每次都發送,可以配置一個有效期,有效期過了之後才會傳送探測請求。預設為1800秒,即30分鐘。
  • allowedHeaders:表示允許的請求頭。預設為*,表示該域中的所有的請求都被允許。

2、全域性配置

(1)新增自定義類實現WebMvcConfigurer介面,然後實現介面中的addCorsMappings方法。如下所示:

@Configuration
public class CrosConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(1800)
                .allowedOrigins("*");
    }
}

說明:

  • addMapping:表示對哪種格式的請求路徑進行跨域處理。
  • allowedHeaders:表示允許的請求頭,預設允許所有的請求頭資訊。
  • allowedMethods:表示允許的請求方法,預設是GET、POST和HEAD。這裡配置為*表示支援所有的請求方法。
  • maxAge:表示探測請求的有效期
  • allowedOrigins表示支援的域

(2)、通過新增全域性過CorsFilter濾器的方式,如下所示:


@Configuration
public class CrosConfig {

    @Bean
    @Order(Integer.MAX_VALUE - 1)
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 允許任何域名使用
        corsConfiguration.addAllowedHeader("*"); // 允許任何頭
        corsConfiguration.addAllowedMethod("*"); // 允許任何方法(post、get等)
        corsConfiguration.setAllowCredentials(true); //允許跨域傳輸所有的header引數
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(configSource);
    }

}