首頁  >  文章  >  Java  >  Spring Boot實現跨域的方式有哪些

Spring Boot實現跨域的方式有哪些

WBOY
WBOY轉載
2023-05-18 10:10:261371瀏覽

一、為什麼會出現跨域問題

出於瀏覽器的同源策略限制。同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。 Web是基於同源策略建立的,瀏覽器只是實現同源策略的一種方式。

在JavaScript中,同源策略將限制不同域之間的交互,防止跨域的攻擊。所謂同源(即指在同一個網域)就是兩個頁面具有相同的協定(protocol),主機(host)和連接埠號碼(port)

二、什麼是跨網域

當一個要求url的協定、網域、連接埠三者之間任一個與目前頁面url不同即為跨域

Spring Boot實現跨域的方式有哪些

#三、非同源限制

  1. 無法讀取非同源網頁的Cookie、LocalStorage 和IndexedDB

  2. 無法接觸到非同系網頁的DOM

  1. #無法向非同源位址發送AJAX 請求
  2. 四、java後端實作CORS跨域請求的方式
  3. 對於CORS的跨域請求,主要有以下幾種方式可供選擇:

傳回新的CorsFilter

  • 重寫WebMvcConfigurer

  • #使用註解@CrossOrigin

  • 手動設定回應頭(HttpServletResponse)

自訂web filter 實作跨域

#注意:

CorFilter / WebMvConfigurer / @CrossOrigin 需要SpringMVC 4.2以上版本才支持,對應springBoot 1.3版本以上

############################################################# ##前面兩種方法是全域CORS配置,而後面兩種是局部CORS配置。如果使用了局部跨域是會覆蓋全域跨域的規則,所以可以透過 @CrossOrigin 註解來進行細粒度更高的跨域資源控制。 ############其實無論哪種方案,最終目的都是修改回應頭,在回應頭中加入瀏覽器所要求的數據,進而實現跨域######### ####1. 傳回新的CorsFilter(全域跨域)######在任意配置類,傳回一個新的CorsFIlter Bean ,並新增映射路徑和特定的CORS配置路徑。 ###
@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}
###2. 重寫WebMvcConfigurer(全域跨域)###
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}
###3. 使用註解(局部跨域)######在控制器(類別上)上使用註解@ CrossOrigin:,表示該類別的所有方法允許跨域。 ###
@RestController
@CrossOrigin(origins = "*")
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}
###在方法上使用註解@CrossOrigin:###
@RequestMapping("/hello")
    @CrossOrigin(origins = "*")
     //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
    public String hello() {
        return "hello world";
    }
###4. 手動設定回應頭(局部跨域)######使用HttpServletResponse 物件新增回應頭(Access-Control- Allow-Origin)來授權原始域,這裡Origin的值也可以設定為「*」,表示全部放行。 ###
@RequestMapping("/index")
public String index(HttpServletResponse response) {
    response.addHeader("Access-Allow-Control-Origin","*");
    return "index";
}
###5. 使用自訂filter實作跨域######先寫一個過濾器,可以取名字為MyCorsFilter.java###
package com.mesnac.aop;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class MyCorsFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    chain.doFilter(req, res);
  }
  public void init(FilterConfig filterConfig) {}
  public void destroy() {}
}
###在web.xml中設定這個過濾器,使其生效###
<!-- 跨域访问 START-->
<filter>
 <filter-name>CorsFilter</filter-name>
 <filter-class>com.mesnac.aop.MyCorsFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>CorsFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 跨域访问 END  -->

以上是Spring Boot實現跨域的方式有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除