最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot3解決跨域請求的方案小結(jié)

 更新時間:2024年07月31日 10:34:21   作者:Yaml墨韻  
解決跨域請求,主要有JSONP,iframe,window.name,CORS等方式,其中CORS方式是最常用的跨域?qū)崿F(xiàn)方式,而且是對各種請求方法、各種數(shù)據(jù)請求類型都是完美支持的,本文介紹了SpringBoot3解決跨域請求的方案小結(jié),需要的朋友可以參考下

在Spring Boot 3中,解決跨域請求(CORS,Cross-Origin Resource Sharing)的問題主要有以下幾種方式:

1. 使用@CrossOrigin注解

你可以直接在Controller類或者具體的請求處理方法上使用@CrossOrigin注解來允許跨域請求。

@RestController  
@RequestMapping("/user")  
@CrossOrigin(origins = "*") // 允許所有來源的請求跨域  
public class UserController {  
    // ...  
}

在這個例子中,@CrossOrigin注解被添加到了控制器類上,表示這個控制器下的所有方法都允許來自http://example.com的GET和POST請求。你也可以將注解添加到特定的方法上,以對該方法應(yīng)用CORS配置。

2. 全局配置CORS

如果你希望全局配置CORS,而不是在每個Controller或方法上單獨(dú)配置,你可以創(chuàng)建一個配置類來實(shí)現(xiàn)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("/**")  
                .allowedOrigins("*") // 允許哪些域的請求,星號代表允許所有  
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允許的方法  
                .allowedHeaders("*") // 允許的頭部設(shè)置  
                .allowCredentials(true) // 是否發(fā)送cookie  
                .maxAge(168000); // 預(yù)檢間隔時間  
    }  
}

在這個配置中,addMapping("/**")表示對所有的路徑都應(yīng)用CORS配置。allowedOrigins("*")表示允許所有來源的訪問,這在生產(chǎn)環(huán)境中可能不是最佳實(shí)踐,通常你會指定具體的域名。allowedMethods定義了允許的HTTP方法,allowedHeaders定義了允許的HTTP頭部,allowCredentials(true)表示是否允許攜帶憑證(cookies, HTTP認(rèn)證及客戶端SSL證明等),maxAge則用于設(shè)置預(yù)檢請求的有效期。

3. 使用Filter實(shí)現(xiàn)CORS

你也可以通過實(shí)現(xiàn)Filter接口來自定義CORS處理邏輯。

import javax.servlet.*;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
public class SimpleCorsFilter implements Filter {  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
            throws IOException, ServletException {  
        HttpServletResponse response = (HttpServletResponse) res;  
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");  
        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");  
        chain.doFilter(req, res);  
    }  
  
    @Override  
    public void init(FilterConfig filterConfig) {}  
  
    @Override  
    public void destroy() {}  
}

然后需要在配置類中注冊這個Filter。

import org.springframework.boot.web.servlet.FilterRegistrationBean;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
@Configuration  
public class FilterConfig {  
  
    @Bean  
    public FilterRegistrationBean<SimpleCorsFilter> corsFilter() {  
        FilterRegistrationBean<SimpleCorsFilter> registrationBean = new FilterRegistrationBean<>();  
        registrationBean.setFilter(new SimpleCorsFilter());  
        registrationBean.addUrlPatterns("/*");  
        return registrationBean;  
    }  
}

4. 使用攔截器(Interceptor)

如果需要更復(fù)雜的CORS邏輯,你可以創(chuàng)建一個攔截器來處理CORS請求。攔截器允許你在請求處理之前或之后添加邏輯。

import org.springframework.web.servlet.HandlerInterceptor;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
public class CorsInterceptor implements HandlerInterceptor {  
  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {  
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");  
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");  
        response.setHeader("Access-Control-Allow-Headers", "*");  
        // 其他CORS相關(guān)的響應(yīng)頭設(shè)置  
        return true;  
    }  
}

然后,你需要在配置類中注冊這個攔截器: 

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
  
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
  
    @Autowired  
    private CorsInterceptor corsInterceptor;  
  
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        registry.addInterceptor(corsInterceptor).addPathPatterns("/**");  
    }  
}
  • 當(dāng)設(shè)置allowedHeaders("*")時,實(shí)際上瀏覽器會發(fā)送實(shí)際請求頭而不是*。出于安全考慮,最好明確指定允許的頭部。
  • 在生產(chǎn)環(huán)境中,確保不要過于寬松地配置CORS,只允許必要的源和方法。
  • 如果你的應(yīng)用部署在代理服務(wù)器后面(如Nginx或Apache),可能還需要在代理服務(wù)器上配置CORS。

5. 響應(yīng)體(Response Body)來設(shè)置CORS

雖然這種方式不如前面提到的幾種方法直接和常用,但在某些特殊場景下,你可能需要手動控制響應(yīng)頭來實(shí)現(xiàn)跨域。

具體實(shí)現(xiàn)時,你可以在Controller的方法中,通過HttpServletResponse對象來設(shè)置Access-Control-Allow-Origin等CORS相關(guān)的HTTP頭。

import javax.servlet.http.HttpServletResponse;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class MyController {  
  
    @GetMapping("/data")  
    public String getData(HttpServletResponse response) {  
        // 設(shè)置允許跨域的來源  
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");  
        // 設(shè)置允許的方法(GET, POST, PUT, DELETE等)  
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");  
        // 設(shè)置允許的頭信息  
        response.setHeader("Access-Control-Allow-Headers", "*");  
        // 設(shè)置預(yù)檢請求的有效期  
        response.setHeader("Access-Control-Max-Age", "3600");  
          
        // 返回?cái)?shù)據(jù)  
        return "Data";  
    }  
}

需要注意的是,手動設(shè)置響應(yīng)頭的方式相對繁瑣,且容易遺漏某些必要的頭信息,導(dǎo)致CORS配置不完整。因此,在實(shí)際開發(fā)中,推薦使用前面提到的方法,它們更為直接且易于管理。

此外,如果你正在使用Spring Security,還需要確保Spring Security的配置不會阻止跨域請求的處理。在某些情況下,你可能需要在Spring Security的配置中允許特定的CORS請求。

6. 通過自定義ResponseBodyAdvice

ResponseBodyAdvice是Spring MVC提供的一個接口,允許你在Controller方法返回響應(yīng)體之前對其進(jìn)行修改。雖然它本身不是專為CORS設(shè)計(jì)的,但你可以利用它在返回響應(yīng)之前添加CORS相關(guān)的HTTP頭。

下面是一個簡單的示例,展示了如何通過實(shí)現(xiàn)ResponseBodyAdvice接口來添加CORS頭:

import org.springframework.core.MethodParameter;  
import org.springframework.http.MediaType;  
import org.springframework.http.server.ServerHttpRequest;  
import org.springframework.http.server.ServerHttpResponse;  
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;  
  
import java.lang.reflect.Type;  
  
public class CorsResponseBodyAdvice implements ResponseBodyAdvice<Object> {  
  
    @Override  
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {  
        // 支持所有返回類型  
        return true;  
    }  
  
    @Override  
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,  
                                   Class<? extends HttpMessageConverter<?>> selectedConverterType,  
                                   ServerHttpRequest request, ServerHttpResponse response) {  
        // 設(shè)置CORS相關(guān)的HTTP頭  
        response.getHeaders().set("Access-Control-Allow-Origin", "http://example.com");  
        response.getHeaders().set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");  
        response.getHeaders().set("Access-Control-Allow-Headers", "*");  
        // 如果有需要,還可以設(shè)置其他CORS相關(guān)的頭,比如預(yù)檢請求的有效期等  
          
        // 返回原始的body,不做修改  
        return body;  
    }  
}

然后,你需要在Spring Boot的配置中注冊這個ResponseBodyAdvice

import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
  
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
  
    @Override  
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {  
        // 注冊你的ResponseBodyAdvice  
        converters.forEach(converter -> {  
            if (converter instanceof MappingJackson2HttpMessageConverter) {  
                ((MappingJackson2HttpMessageConverter) converter).setResponseBodyAdvice(new CorsResponseBodyAdvice());  
            }  
        });  
    }  
}

這種方法的優(yōu)點(diǎn)在于它可以全局地應(yīng)用于所有Controller的響應(yīng),而無需在每個Controller或方法上單獨(dú)設(shè)置。然而,它同樣也有一些局限性,比如你可能需要手動處理一些CORS的細(xì)節(jié),并且這種方式不如使用Spring提供的CORS支持那么直接和靈活。

在選擇解決方案時,應(yīng)該根據(jù)項(xiàng)目的具體需求和團(tuán)隊(duì)的偏好來權(quán)衡各種方法的優(yōu)缺點(diǎn)。如果項(xiàng)目中有大量的Controller需要處理跨域請求,并且希望有一個統(tǒng)一且全局的解決方案,那么使用WebMvcConfigurer或CorsFilter可能是更好的選擇。如果只需要在特定的Controller或方法上處理跨域請求,那么使用@CrossOrigin注解可能更為簡單直接。

以上就是SpringBoot3解決跨域請求的方案小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3跨域請求的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Kafka的生產(chǎn)者和消費(fèi)者機(jī)制使用方式

    Kafka的生產(chǎn)者和消費(fèi)者機(jī)制使用方式

    本文介紹了Kafka的HighLevelAPI和LowLevelAPI,并詳細(xì)講解了Kafka生產(chǎn)者和消費(fèi)者的基本流程、工作機(jī)制、分區(qū)路由機(jī)制、消息緩存機(jī)制、發(fā)送應(yīng)答機(jī)制、消息冪等性以及消息事務(wù)機(jī)制
    2025-11-11
  • Spring?cloud如何實(shí)現(xiàn)FeignClient指定Zone調(diào)用

    Spring?cloud如何實(shí)現(xiàn)FeignClient指定Zone調(diào)用

    這篇文章主要介紹了Spring?cloud如何實(shí)現(xiàn)FeignClient指定Zone調(diào)用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中對話框的彈出方法

    Java中對話框的彈出方法

    下面小編就為大家?guī)硪黄狫ava中對話框的彈出方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • FeignMultipartSupportConfig上傳圖片配置方式

    FeignMultipartSupportConfig上傳圖片配置方式

    這篇文章主要介紹了FeignMultipartSupportConfig上傳圖片配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java?poi之XWPFDocument如何讀取word內(nèi)容并創(chuàng)建新的word

    java?poi之XWPFDocument如何讀取word內(nèi)容并創(chuàng)建新的word

    這篇文章主要介紹了java?poi之XWPFDocument如何讀取word內(nèi)容并創(chuàng)建新的word問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Spring中的@RefreshScope注解作用

    Spring中的@RefreshScope注解作用

    這篇文章主要介紹了Spring中的@RefreshScope注解作用詳解,@RefreshScope注解是Spring Cloud中的一個重要注解,用于實(shí)現(xiàn)動態(tài)刷新配置的功能,當(dāng)我們在應(yīng)用程序中使用@Value注解獲取配置屬性時,如果配置發(fā)生變化,需要重啟應(yīng)用程序才能生效,需要的朋友可以參考下
    2023-10-10
  • 微信公眾號支付(一)如何獲取用戶openId

    微信公眾號支付(一)如何獲取用戶openId

    本篇文章給大家介紹微信公眾號支付如何獲取用戶openid,需要授權(quán)回調(diào)頁面域名等一系列途徑實(shí)現(xiàn)此功能,需要的朋友可以參考下
    2015-09-09
  • Java中的System類、BigInteger類和BigDecimal類詳解

    Java中的System類、BigInteger類和BigDecimal類詳解

    這篇文章主要介紹了Java中的System類、BigInteger類和BigDecimal類詳解,arraycopy()方法,復(fù)制數(shù)組元素,比較適合底層調(diào)用,一般使用Arrays.copyOf()完成復(fù)制數(shù)組,需要的朋友可以參考下
    2023-09-09
  • 淺談一下SpringBoot中的異步任務(wù)

    淺談一下SpringBoot中的異步任務(wù)

    這篇文章主要介紹了淺談一下SpringBoot中的異步任務(wù),SpringBoot 中的異步任務(wù)主要是指在 SpringBoot 中使用異步線程完成處理任務(wù),在 SpringBoot 中使用異步線程非常簡單,只需要兩個注解就可以搞定,需要的朋友可以參考下
    2023-10-10
  • Java程序免安裝JDK的運(yùn)行方案

    Java程序免安裝JDK的運(yùn)行方案

    文章介紹了將JDK和Java程序一起打包,通過啟動腳本直接調(diào)用內(nèi)置JDK,實(shí)現(xiàn)無需安裝JDK即可一鍵運(yùn)行Java程序,適合綠色部署、低技術(shù)門檻和快速交付場景,需要的朋友可以參考下
    2025-10-10

最新評論

靖远县| 凤山县| 边坝县| 晋江市| 花莲县| 夏河县| 紫阳县| 仪征市| 鹿泉市| 城市| 钟山县| 肃北| 湘潭县| 贵德县| 新建县| 冀州市| 博罗县| 江源县| 正阳县| 华宁县| 家居| 晋江市| 抚顺市| 长治县| 杭锦旗| 固镇县| 中江县| 洛宁县| 兰坪| 波密县| 彭阳县| 高台县| 夏邑县| 尉氏县| 临潭县| 岳普湖县| 峨山| 和平县| 义乌市| 阿鲁科尔沁旗| 巴林右旗|