91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot跨域的案例分析

發布時間:2020-10-28 14:58:38 來源:億速云 閱讀:174 作者:小新 欄目:編程語言

小編給大家分享一下SpringBoot跨域的案例分析,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

前言:公司的SpringBoot項目出于某種原因,經常樣處理一些跨域請求。

一。以前通過查閱相關資料自己寫的一個處理跨域的類,如下。

1.1首先定義一個filter(攔截所有請求,包括跨域請求)

public class CrossDomainFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {     
        HttpServletRequest hreq = (HttpServletRequest) request;  //
        HttpServletResponse hresp = (HttpServletResponse) response; 
        //跨域
        hresp.setHeader("Access-Control-Allow-Origin", "*");  //設置相應頭
        //跨域 Header
        hresp.setHeader("Access-Control-Allow-Methods", "*");
        hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,x-requested-with,requesttype");
        //header('Access-Control-Allow-Headers:x-requested-with,content-type,requesttype');
        // 瀏覽器是會先發一次options請求,如果請求通過,則繼續發送正式的post請求
        // 配置options的請求返回
        if (hreq.getMethod().equals("OPTIONS")) {  //如果發現該請求為OPTION,則直接返回(不需要進入系統),并且設置相應信息
            hresp.setStatus(200);
            // hresp.setContentLength(0);
            hresp.getWriter().write("OPTIONS returns OK");
            return;
        }
        // Filter 只是鏈式處理,請求依然轉發到目的地址。
        chain.doFilter(request, response);
    }
}

1.2  注冊一個配置類(Configuration),把上面定義的filter類注冊到上下文環境中

@Configuration
public class WebConfiguration {
    @Bean
    public RemoteIpFilter remoteIpFilter() {
        return new RemoteIpFilter();
    }
    @Bean
    public FilterRegistrationBean<CrossDomainFilter> testFilterRegistration() {
        FilterRegistrationBean<CrossDomainFilter> registration = new FilterRegistrationBean<CrossDomainFilter>();
        registration.setFilter(new CrossDomainFilter());
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("MyFilter");
        registration.setOrder(1);
        return registration;
    }
}

備注:這個配置類主要解決我們編寫的filter(CrossDomainFilter )攔截那些請求

二. SpringBoot自己的解決跨域的Filter(CorsFilter) ,該filter的源碼很簡單,可直接查看還類的doFilterInternal() 方法,因為該發法在doFilter()方法中會調用(可以理解就是Filter的doFilter()方法)。

處理過程也是接受到OPTION方法并相應200并返回。

@Configuration
@EnableAutoConfiguration
public class CrossOriginconfig {
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        // 設置你要允許的網站域名,如果全允許則設為 *
        corsConfiguration.addAllowedOrigin("*");
        // 如果要限制 HEADER 或 METHOD 請自行更改
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        System.out.println("confi init");
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

三:個人對跨域問題的小結

瀏覽器在發送請求之前,最先檢測到跨域問題,并在發送跨域請求之前先發送了一個類型為OPTIONS的請求(請求地址不變,并且請求頭上攜帶了一些其他信息),該請求必須得到服務器響應(請查CrossDomainFilter ),如果該請求沒有得到響應,則瀏覽器不會發送真正的請求了。

3.1 :瀏覽器發送的OPTION請求(試探性的請求)

SpringBoot跨域的案例分析SpringBoot跨域的案例分析

備注: 有圖我們發現請求地址不變(),請求方法為OPTION,并且請求頭中攜帶了一些信息該信息可以表明我是一個跨域請求,并且請求的方式是POST。。

3.2 :服務器需要對該請求做出相應,(請查CrossDomainFilter )

1)首先設置相應相應頭(告訴瀏覽器我支持的跨域請求的一些信息)

2) 設置相應狀態為200,并且返回數據(任意數據)

3.3 :瀏覽器獲得到了OPTION請求的相應(服務器接受跨域),故放心發送真正的請求,如下

SpringBoot跨域的案例分析

1)對比OPTION請求,請求地址沒變^_^

2)對比請求方式該請求為POST.  并且POST請求在OPTIN中已經告訴服務器了(Access-Control-Request-Method)。

3)對比OPTION請求的頭,該請求并沒有Access-Control-Allow-****的相關參數。

看完了這篇文章,相信你對SpringBoot跨域的案例分析有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普安县| 民丰县| 上杭县| 南丰县| 罗甸县| 灵山县| 汝城县| 舟山市| 沙河市| 弥勒县| 汝州市| 固阳县| 拜城县| 东乌珠穆沁旗| 玛沁县| 格尔木市| 厦门市| 永仁县| 巨鹿县| 鄢陵县| 勐海县| 门源| 鲁甸县| 肃宁县| 汶川县| 福贡县| 同心县| 高台县| 江城| 千阳县| 都江堰市| 澄城县| 新乡县| 郎溪县| 兰州市| 丰宁| 桃源县| 庆云县| 馆陶县| 德格县| 桦川县|