使用SpringBoot解決跨域問題

一、什麼是跨域問題

1、什麼是同源:同源是指訪問同一個域名、協議和埠號。

2、什麼是跨域:協議、域名、埠號任意一個不同就會出現跨域問題。

3、為什麼要限制跨域:同源策略的目的在於保護用戶隱私,防止惡意網站竊取數據。

二、SpringBoot如何解決跨域

SpringBoot在使用時,可以使用註解進行跨域解決。比如使用@CrossOrigin註解來解決跨域問題。

@CrossOrigin(origins = "*", maxAge = 3600)
@GetMapping("/test")
public String test(){
    return "test";
}

代碼解析:

@CrossOrigin註解允許來自所有源的訪問,同時有效期設定為3600秒。

origins參數是一個字元串數組類型,表示允許訪問的源(CORS標準,即Cross-Origin Resource Sharing,中文名為跨源資源共享)。如果使用 * 作為通配符則允許任意源訪問。

maxAge參數表示在指定時間內不需要再發起預檢驗請求(OPTIONS)。

三、全局配置跨域

可以在SpringBoot的Web配置類中進行全局跨域配置。

@Configuration
public class CorsConfiguration implements WebMvcConfigurer {

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

代碼解析:

CorsRegistry是Spring提供的一個對象,可以配置跨域策略。

addMapping方法表示攔截所有路徑。

allowedOrigins方法表示允許的源。

allowedMethods方法表示允許的請求方法。

allowedHeaders方法表示允許的請求頭。

allowCredentials方法表示是否可以將響應頭暴露給前端。

maxAge方法表示有效期時間。

四、攔截器解決跨域

使用攔截器可以在請求到達Controller之前進行跨域的處理。

@Component
public class CorsInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "*");
        response.setHeader("Access-Control-Max-Age", "3600");
        return true;
    }
}

代碼解析:

繼承自HandlerInterceptor的CorsInterceptor,實現了preHandle方法,該方法是在請求到達Controller之前進行的操作。

設置響應頭信息Access-Control-Allow-Origin表示允許的源。

設置響應頭信息Access-Control-Allow-Headers表示允許的請求頭。

設置響應頭信息Access-Control-Allow-Credentials表示是否可以將響應頭暴露給前端。

設置響應頭信息Access-Control-Allow-Methods表示允許的請求方法。

設置響應頭信息Access-Control-Max-Age表示有效期時間。

五、使用Filter實現跨域解決

Filter是javax.servlet提供的一個過濾器介面,可以使用Filter來實現對請求進行過濾和響應處理。

@Component
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "*");
        response.setHeader("Access-Control-Max-Age", "3600");
        chain.doFilter(req, res);
    }
}

代碼解析:

實現Filter介面,實現doFilter方法進行操作。

HttpServletRequest和HttpServletResponse是javax.servlet提供的請求和響應對象。

設置響應頭信息Access-Control-Allow-Origin表示允許的源。

設置響應頭信息Access-Control-Allow-Headers表示允許的請求頭。

設置響應頭信息Access-Control-Allow-Credentials表示是否可以將響應頭暴露給前端。

設置響應頭信息Access-Control-Allow-Methods表示允許的請求方法。

設置響應頭信息Access-Control-Max-Age表示有效期時間。

六、總結

以上是SpringBoot解決跨域問題的多種方式,開發者可以根據自己的需要選擇合適的解決方案。

原創文章,作者:PLDBF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333005.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
PLDBF的頭像PLDBF
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相關推薦

  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智慧等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示「文件中含有宏,保存將導致宏不可用」的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • 從ga角度解讀springboot

    springboot作為目前廣受歡迎的Java開發框架,其中的ga機制在整個開發過程中起著至關重要的作用。 一、ga是什麼 ga即Group Artifacts的縮寫,它是Mave…

    編程 2025-04-29
  • Java Thread.start() 執行幾次的相關問題

    Java多線程編程作為Java開發中的重要內容,自然會有很多相關問題。在本篇文章中,我們將以Java Thread.start() 執行幾次為中心,為您介紹這方面的問題及其解決方案…

    編程 2025-04-29
  • Python爬蟲亂碼問題

    在網路爬蟲中,經常會遇到中文亂碼問題。雖然Python自帶了編碼轉換功能,但有時候會出現一些比較奇怪的情況。本文章將從多個方面對Python爬蟲亂碼問題進行詳細的闡述,並給出對應的…

    編程 2025-04-29
  • NodeJS 建立TCP連接出現粘包問題

    在TCP/IP協議中,由於TCP是面向位元組流的協議,發送方把需要傳輸的數據流按照MSS(Maximum Segment Size,最大報文段長度)來分割成若干個TCP分節,在接收端…

    編程 2025-04-29
  • 如何解決vuejs應用在nginx非根目錄下部署時訪問404的問題

    當我們使用Vue.js開發應用時,我們會發現將應用部署在nginx的非根目錄下時,訪問該應用時會出現404錯誤。這是因為Vue在刷新頁面或者直接訪問非根目錄的路由時,會認為伺服器上…

    編程 2025-04-29
  • 如何解決egalaxtouch設備未找到的問題

    egalaxtouch設備未找到問題通常出現在Windows或Linux操作系統上。如果你遇到了這個問題,不要慌張,下面我們從多個方面進行詳細闡述解決方案。 一、檢查硬體連接 首先…

    編程 2025-04-29
  • Python折扣問題解決方案

    Python的折扣問題是在計算購物車價值時常見的問題。在計算時,需要將原價和折扣價相加以得出最終的價值。本文將從多個方面介紹Python的折扣問題,並提供相應的解決方案。 一、Py…

    編程 2025-04-28
  • Python存款買房問題

    本文將會從多個方面介紹如何使用Python來解決存款買房問題。 一、計算存款年限和利率 在存款買房過程中,我們需要計算存款年限和存款利率。我們可以使用以下代碼來計算存款年限和利率:…

    編程 2025-04-28

發表回復

登錄後才能評論