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

詳解springboot解決CORS跨域的三種方式

 更新時(shí)間:2022年07月01日 11:22:48   作者:yzh_1346983557  
本文主要介紹了詳解springboot解決CORS跨域的三種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、實(shí)現(xiàn)WebMvcConfigurer接口

@Configuration
public class WebConfig implements WebMvcConfigurer {
    /**
     * 添加跨域支持
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 允許跨域訪問的路徑  '/**'表示應(yīng)用的所有方法
        registry.addMapping("/**")
            // 允許跨域訪問的來源 '*'表示所有域名來源
            .allowedOriginPatterns("*")
            // .allowedOrigins("*") // 允許跨域訪問的來源 SpringBoot2.4.0之前的版本
            // 允許跨域請求的方法  '*'表示所有
            .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
            // 是否允許發(fā)送cookie true-允許 false-不允許 默認(rèn)false。對服務(wù)器有特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json,這個(gè)值只能設(shè)為true
            .allowCredentials(true)
            // 預(yù)檢間隔時(shí)間1小時(shí),單位為秒。指定本次預(yù)檢請求的有效期,在有效期間,不用發(fā)出另一條預(yù)檢請求。
            // 瀏覽器發(fā)出CORS簡單請求,只需要在頭信息之中增加一個(gè)Origin字段
            // 瀏覽器發(fā)出CORS非簡單請求,會(huì)在正式通信之前,增加一次OPTIONS查詢請求,稱為"預(yù)檢"請求(preflight)。瀏覽器先詢問服務(wù)器,當(dāng)前網(wǎng)頁所在的域名是否在服務(wù)器的許可名單之中,以及可以使用哪些HTTP動(dòng)詞和頭信息字段。只有得到肯定答復(fù),瀏覽器才會(huì)發(fā)出正式的XMLHttpRequest請求,否則就報(bào)錯(cuò)。
            .maxAge(3600)
            // 允許跨域請求可攜帶的header,'*'表所有header頭。CORS請求時(shí),XMLHttpRequest對象的getResponseHeader()方法只能拿到6個(gè)基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必須在Access-Control-Expose-Headers里面指定
            .allowedHeaders("*");
    }
}

二、實(shí)現(xiàn)filter過濾器方式

@WebFilter
@Configuration
public class CorsFilter 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", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        chain.doFilter(req, res);
    }
}

三、注解@CrossOrigin

@CrossOrigin(originPatterns = "*", allowCredentials = "true")

@CrossOrigin可配置在方法上,也可配置在類上。 

四、實(shí)戰(zhàn)

創(chuàng)建兩個(gè)普通的SpringBoot項(xiàng)目A、B,A配置8081端口,B配置8082端口。

在A的resources/static目錄下創(chuàng)建一個(gè)html文件index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
 
<!-- jquery庫可百度jquery cdn -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script>
    function btnClick() {
        $.get('http://localhost:8082/hello/hello', function (msg) {
            $("#app").html(msg);
        });
    }
 
    function btnClick2() {
        $.post('http://localhost:8082/hello/hello', function (msg) {
            $("#app").html(msg);
        });
    }
</script>
 
<body>
 
<div id="app"></div>
<input type="button" onclick="btnClick()" value="get_button">
<input type="button" onclick="btnClick2()" value="post_button">
 
</body>
</html>

B提供2個(gè)web接口:

@RestController
@RequestMapping("/hello")
public class HelloController {
    // @CrossOrigin(originPatterns = "*", allowCredentials = "true")
    @GetMapping("/hello")
    public String hello() {
        System.out.println("get hello");
        return "get hello";
    }
 
    // @CrossOrigin(originPatterns = "*", allowCredentials = "true")
    @PostMapping("/hello")
    public String hello2() {
        System.out.println("post hello");
        return "post hello";
    }
}

分別啟動(dòng)A、B服務(wù),瀏覽器訪問A的index.html,點(diǎn)擊按鈕,瀏覽器控制臺(tái)報(bào)錯(cuò)如下:http://localhost:8081/index.html

Access to XMLHttpRequest at 'http://localhost:8082/hello/hello' from origin 'http://localhost:8081' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 為B項(xiàng)目使用方式一,添加跨域支持,重啟,再次點(diǎn)擊按鈕,可正常訪問,觀察響應(yīng)頭多了支持跨域的信息:

五、cookie的跨域

從Chrome51開始,瀏覽器cookie添加了一個(gè)新屬性SameSite,以防止 CSRF 攻擊和用戶跟蹤。

SameSite可取值:Strict、Lax、None。

Strict最為嚴(yán)格,完全禁止第三方 Cookie,跨站點(diǎn)時(shí),任何情況下都不會(huì)發(fā)送 Cookie。換言之,只有當(dāng)前網(wǎng)頁的 URL 與請求目標(biāo)一致,才會(huì)帶上 Cookie。

Lax規(guī)則稍稍放寬,大多數(shù)情況也是不發(fā)送第三方 Cookie,但是導(dǎo)航到目標(biāo)網(wǎng)址的 Get 請求除外。導(dǎo)航到目標(biāo) URL 的 GET 請求僅包括三種情況:鏈接、預(yù)加載請求和 GET 表單。

網(wǎng)站可以選擇顯式關(guān)閉SameSite屬性,將其設(shè)為None。不過,前提是必須同時(shí)設(shè)置Secure屬性(Cookie 只能通過 HTTPS 協(xié)議發(fā)送),否則無效。

SpringBoot 2.6及以上版本

網(wǎng)上查到可使用配置(但親測無效?。?/p>

server.servlet.session.cookie.same-site=none
server.servlet.session.cookie.secure=true

SpringBoot 2.6以下版本

如果使用 Tomcat 作為服務(wù)器,則可以通過以下配置設(shè)置會(huì)話 cookie 的 SameSite 屬性(親測無效!)。

server.servlet.session.cookie.secure=true
@Configuration
public class TomcatCookieConfig {
    @Bean
    public TomcatContextCustomizer sameSiteCookiesConfig() {
        return context -> {
            final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
            // SameSite
            cookieProcessor.setSameSiteCookies(SameSiteCookies.NONE.getValue());
            context.setCookieProcessor(cookieProcessor);
        };
    }
}

如果您使用的是 Spring-Session,那么您可以使用以下配置來設(shè)置 cookie 的 SameSite 屬性。

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
        </dependency>
@Configuration
public class SpringSessionConfiguration {
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        // Strict-嚴(yán)格模式 Lax-松懈模式 None-無
        cookieSerializer.setSameSite("None");
        cookieSerializer.setUseSecureCookie(true);
        return cookieSerializer;
    }
}

自己的解決方式

@Configuration
public class CookieConfig {
    private static String domain;
 
    @Value("${domain}")
    public void setDomain(String domain) {
        CookieConfig.domain = domain;
    }
 
    public static HttpCookie generateHttpCookie(String name, String value) {
        return ResponseCookie.from(name, value)
            .domain(domain)
            // cookie跨域設(shè)置
            .sameSite("None")
            // 在https下傳輸,配合sameSite=None使用
            .secure(true)
            .path("/")
            // 有效期24小時(shí)
            .maxAge(60 * 60 * 24)
            .build();
    }
}
    @GetMapping("/hello")
    public String hello(HttpServletResponse response) {
        HttpCookie cookie2 = CookieConfig.generateHttpCookie("age", "18");
        response.addHeader(HttpHeaders.SET_COOKIE, cookie2.toString());
        HttpCookie cookie3 = CookieConfig.generateHttpCookie("id", "77");
        response.addHeader(HttpHeaders.SET_COOKIE, cookie3.toString());
        System.out.println("get hello");
        return "get hello";
    }

參考:https://www.cnblogs.com/javastack/p/14255114.html

到此這篇關(guān)于詳解springboot解決CORS跨域的三種方式的文章就介紹到這了,更多相關(guān)springboot CORS跨域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC文件上傳原理及實(shí)現(xiàn)過程解析

    SpringMVC文件上傳原理及實(shí)現(xiàn)過程解析

    這篇文章主要介紹了SpringMVC文件上傳原理及實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java中的類型擦除type?erasure示例詳解

    java中的類型擦除type?erasure示例詳解

    泛型是java從JDK?5開始引入的新特性,泛型的引入可以讓我們在代碼編譯的時(shí)候就強(qiáng)制檢查傳入的類型,從而提升了程序的健壯度,泛型可以用在類和接口上,在集合類中非常常見,本文將會(huì)講解泛型導(dǎo)致的類型擦除
    2023-09-09
  • Java swing框架實(shí)現(xiàn)的貪吃蛇游戲完整示例

    Java swing框架實(shí)現(xiàn)的貪吃蛇游戲完整示例

    這篇文章主要介紹了Java swing框架實(shí)現(xiàn)的貪吃蛇游戲,結(jié)合完整實(shí)例形式分析了java使用swing框架結(jié)合awt圖形繪制實(shí)現(xiàn)貪吃蛇游戲的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • SpringBoot JWT令牌的使用

    SpringBoot JWT令牌的使用

    JWT令牌中包含了一個(gè)用戶名和哈希值,這些都需要進(jìn)行驗(yàn)證,本文主要介紹了SpringBoot JWT令牌的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Swing常用組件之文本框和文本區(qū)

    Swing常用組件之文本框和文本區(qū)

    這篇文章主要為大家詳細(xì)介紹了Swing常用組件之文本框(JTestField)和文本區(qū)(JTextArea),Swing是一個(gè)用于開發(fā)Java應(yīng)用程序用戶界面的開發(fā)工具包,本文開始帶大家學(xué)習(xí)Swing
    2016-05-05
  • Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題

    Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題

    這篇文章主要介紹了Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java實(shí)現(xiàn)貪吃蛇游戲的示例代碼

    Java實(shí)現(xiàn)貪吃蛇游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • springboot普通類中如何獲取session問題

    springboot普通類中如何獲取session問題

    這篇文章主要介紹了springboot普通類中如何獲取session問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • SpringBoot與JWT整合方式

    SpringBoot與JWT整合方式

    文章介紹了如何在Spring?Boot項(xiàng)目中整合JWT(JSON?Web?Token),包括JWT的結(jié)構(gòu)、使用方法、測試以及配置,主要內(nèi)容涵蓋了依賴配置、數(shù)據(jù)庫表設(shè)計(jì)、實(shí)體類、數(shù)據(jù)訪問層、服務(wù)層、JWT工具類、攔截器配置和控制器測試等多個(gè)方面
    2024-11-11
  • JavaBean字段如何防止非空賦值

    JavaBean字段如何防止非空賦值

    這篇文章主要介紹了JavaBean字段如何防止非空賦值的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

神木县| 都兰县| 武乡县| 毕节市| 张家港市| 会东县| 通州区| 水城县| 安平县| 延庆县| 延川县| 行唐县| 乌恰县| 茂名市| 刚察县| 定边县| 永福县| 广汉市| 贺州市| 清远市| 潮安县| 益阳市| 阿巴嘎旗| 清原| 望都县| 行唐县| 松滋市| 永泰县| 调兵山市| 志丹县| 四会市| 石柱| 滦平县| 象州县| 苍南县| 油尖旺区| 镇安县| 马公市| 威信县| 巩义市| 高碑店市|