<pre id="13q3s"><s id="13q3s"><menu id="13q3s"></menu></s></pre>
          <tr id="13q3s"><s id="13q3s"></s></tr>

          千鋒教育-做有情懷、有良心、有品質的職業教育機構

          領取全套視頻

          關注千鋒學習站小程序
          隨時隨地免費學習課程

          當前位置:首頁  >  關于學院  >  技術論壇  >  正文

          爆破專欄丨Spring Security系列教程解決Spring Security環境中的跨域問題

          時間:2021-10-29 11:40     來源:千鋒教育 作者:qyf
          分享: 更多

            原創:千鋒一一哥

            前言

            上一章節中,一一哥 給各位講解了同源策略和跨域問題,以及跨域問題的解決方案,在本篇文章中,我會帶大家進行代碼實現,看看在Spring Security環境中如何解決跨域問題。

            一. 啟用Spring Security 的CORS支持

            1. 創建web接口

            我先在SpringBoot環境中,創建一個端口號為8080的web項目,注意這個web項目沒有引入Spring Security的依賴包。然后在其中創建一個IndexController,定義兩個測試接口以便被ajax進行跨域訪問。8080項目的代碼結構:

            @RestController

            public class IndexController {

            @GetMapping("/hello")

            public String hello() {

            return "get hello";

            }

            @PostMapping("/hello")

            public String hello2() {

            return "post hello";

            }

            }

            請參考如下代碼結構進行項目創建。

          圖片1

            2. 執行ajax請求

            我們接下來再創建另一個端口號為8082的web項目,注意這個web項目也沒有引入Spring Security的依賴包。接著在這里定義一個index.html頁面,利用ajax跨域訪問8080項目中的web接口。

            8082項目的代碼結構:

          <!DOCTYPE html>

          <html lang="en">

          <head>

              <meta charset="UTF-8">

              <title>Index</title>

              <script type="text/javascript" src="jquery-2.1.0.js"></script>

          </head>

          <body>

          <div id="app"></div>

          <input type="button" onclick="btnClick()" value="get請求">

          <input type="button" onclick="btnClick2()" value="post請求">

           

          <script>

              function btnClick() {

                  $.get('http://localhost:8080/hello', function (msg) {

                      $("#app").html(msg);

                  });

              }

           

              function btnClick2() {

                  $.post('http://localhost:8080/hello', function (msg) {

                      $("#app").html(msg);

                  });

              }

          </script>

           

          </body>

          </html>  

            請參考如下代碼結構進行項目創建。

          圖片2

            3. 發起跨域請求

            我們訪問8082項目中的index.html頁面,然后分別執行get與post請求,這時候就可以在瀏覽器的控制臺上看到產生了CORS跨域問題,出現了CORS error狀態,在請求頭中出現了Referer Policy: strict-origin-when-cross-origin。

          圖片3

          圖片4

            4. 解決跨域問題

            既然現在產生了跨域問題,那么該怎么解決呢?其實我們可以采用如下兩種方式之一來解決跨域問題。

            方式1:在接口方法上利用@CrossOrigin注解解決跨域問題

            @RestController

            public class IndexController {

            @CrossOrigin(value = "http://localhost:8082")

            @GetMapping("/hello")

            public String hello() {

            return "get hello";

            }

            @CrossOrigin(value = "http://localhost:8082")

            @PostMapping("/hello")

            public String hello2() {

            return "post hello";

            }

            }

            方式2:通過實現WebMvcConfigurer接口來解決跨域問題

            @Configuration

            public class WebMvcConfig implements WebMvcConfigurer {

            @Override

            public void addCorsMappings(CorsRegistry registry) {

            registry.addMapping("/**")

            .allowedOrigins("http://localhost:8082")

            .allowedMethods("*")

            .allowedHeaders("*");

            }

            }

            當進行了跨域設置之后,我們再次進行跨域請求,就可以看到請求成功了。

          圖片5

            二. Spring Security環境下的跨域問題解決

            1. 引入Spring Security依賴

            通過上面的配置,我們已經解決了Ajax的跨域請求問題,但是這個案例中也有潛在的威脅存在,常見的就是 CSRF(Cross-site request forgery) 跨站請求偽造??缯菊埱髠卧煲脖环Q為 one-click attack 或者 session riding,通??s寫為 CSRF 或者 XSRF,是一種挾制用戶在當前已登錄的 Web 應用程序上執行非本意的操作的攻擊方法。

            所以為了提高網站的安全性,我在上面Spring Boot項目的基礎之上,添加Spring Security的依賴包,但是暫時不進行任何別的操作。

            <dependencies>

                  <dependency>

                      <groupId>org.springframework.boot</groupId>

                      <artifactId>spring-boot-starter-web</artifactId>

                  </dependency>

           

                  <dependency>

                      <groupId>org.springframework.boot</groupId>

                      <artifactId>spring-boot-starter-security</artifactId>

                  </dependency>

              </dependencies>

            2. 重啟8080項目進行測試

            接著我就重啟8080這個Spring Boot項目,然后在8082項目中再次進行跨域請求,我們會發現在引入Spring Security后,再次產生了跨域問題。

          圖片6

            3. 解決Spring Security環境下跨域問題的3種方案

            通過實驗可知,如果使用了 Spring Security,上面的跨域配置會失效,因為請求會被 Spring Security 攔截。那么在Spring Security環境中,如何解決跨域問題呢?這里我們有3種方式可以開啟 Spring Security 對跨域的支持。

            3.1 方式一:開啟cors方法

            我們在上面的案例之上,編寫一個SecurityConfig配置類,在configure方法中,利用cors() 開啟Spring Security 對 CORS 的支持:

            @EnableWebSecurity

            public class SecurityConfig extends WebSecurityConfigurerAdapter {

            @Override

            protected void configure(HttpSecurity http) throws Exception {

            http.authorizeRequests()

            .anyRequest()

            .permitAll()

            .and()

            .formLogin()

            .permitAll()

            .and()

            .httpBasic()

            .and()

            //支持跨域訪問

            .cors()

            .and()

            .csrf()

            .disable();

            }

            }

            3.2 方式二:進行全局配置

            第二種方式是去除上面的跨域配置,直接在 Spring Security 中做全局配置,如下:

            @EnableWebSecurity

            public class SecurityConfig extends WebSecurityConfigurerAdapter {

            @Override

            protected void configure(HttpSecurity http) throws Exception {

            http.authorizeRequests()

            .anyRequest()

            .permitAll()

            .and()

            .formLogin()

            .permitAll()

            .and()

            .httpBasic()

            .and()

            //支持跨域訪問

            .cors()

            .configurationSource(corsConfigurationSource())

            .and()

            .csrf()

            .disable();

            }

            @Bean

            public CorsConfigurationSource corsConfigurationSource() {

            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

            CorsConfiguration configuration = new CorsConfiguration();

            configuration.setAllowCredentials(true);

            configuration.setAllowedOrigins(Collections.singletonList("*"));

            configuration.setAllowedMethods(Collections.singletonList("*"));

            configuration.setAllowedHeaders(Collections.singletonList("*"));

            configuration.setMaxAge(Duration.ofHours(1));

            source.registerCorsConfiguration("/**", configuration);

            return source;

            }

            }

            以上2個方法,都可以實現在Spring Security環境下的跨域訪問。

            3.3 方式三:支持OAuth2的跨域訪問

            我們開發時,還有一種情況就是支持 OAuth2 相關接口的跨域,比如用戶要訪問 OAuth2 中的 /oauth/token 等接口。我們可以配置一個全局的 CorsFilter 跨域過濾器類,核心代碼如下:

            /**

            * 跨域配置方式3:定義全局跨域過濾器

            **/

            @Configuration

            public class GlobalCorsConfiguration {

            @Bean

            public CorsFilter corsFilter() {

            CorsConfiguration corsConfiguration = new CorsConfiguration();

            corsConfiguration.setAllowCredentials(true);

            corsConfiguration.addAllowedOrigin("*");

            corsConfiguration.addAllowedHeader("*");

            corsConfiguration.addAllowedMethod("*");

            UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();

            urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);

            return new CorsFilter(urlBasedCorsConfigurationSource);

            }

            }

            @EnableWebSecurity

            public class SecurityConfig extends WebSecurityConfigurerAdapter {

            @Override

            protected void configure(HttpSecurity http) throws Exception {

            //跨域方式3:

            http.requestMatchers()

            .antMatchers(HttpMethod.OPTIONS, "/oauth/**")

            .and()

            .csrf()

            .disable()

            .formLogin()

            .and()

            .cors();

            }

            }

            該方式也可以實現Spring Security中的跨域訪問。

            4. 代碼結構

            以下是本案例的代碼結構,可以參考下圖進行項目創建:

          圖片7

            至此,我就帶各位解決了Spring Security環境中的跨域問題,你學會了嗎?

          圖片8

          關注WX公眾號【Java架構棧】,跟著千鋒一起學Java

          相關文章

          • 北京總部地址:北京市海淀區寶盛北里西區28號中關村智誠科創大廈4層
            北京沙河校區:北京市昌平區沙陽路18號北京科技職業技術學院廣場服務樓
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 深圳校區地址:深圳市寶安區寶安大道5010號西部硅谷B座A區6層A605/B座C區1層108
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 上海校區地址:上海市寶山區同濟支路199號智慧七立方3號樓2-4層
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 廣州校區地址:廣州市白云區永平街永泰學山塘學山文化創意谷A1棟六樓
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 鄭州二七區校區地址:鄭州市二七區航海中路60號海為科技園C區10層
            鄭州高新區校區地址:鄭州市高新區金梭路與銀杏路交叉口教育科技產業園南門D座4層
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 大連校區地址:遼寧省大連市高新園區愛賢街10號大連設計城A座901
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 武漢金融港校區地址:武漢市東新區光谷大道77號金融港B18棟三、四層
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 成都校區地址:成都市高新區肖家河沿街138號肖家河大廈三樓
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 西安校區地址:西安市雁塔區高新六路52號立人科技C座西區4樓
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 杭州旺田校區:浙江省杭州市上城區九堡鎮旺田書畫城A座4層
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 青島校區地址:青島市市北區龍城路31號卓越世紀中心4號樓5層
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 重慶校區地址:重慶市高新區科園一路2號大西洋國際12-1
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 長沙校區地址:湖南省長沙市岳麓區麓谷企業廣場A2棟三單元306號
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 哈爾濱校區地址:哈爾濱市松北區世澤路689號 科技創新城4號樓405
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 南京校區地址:南京市建鄴區應天大街780號弘輝產業園1棟2層
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 太原校區地址:太原市小店區長治路230號能源互聯網大廈6層
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 沈陽校區地址:遼寧省沈陽市渾南區世紀路16號東大軟件園B園B1座A201
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 合肥校區地址:合肥市包河區徽州大道396號東方廣場B座12A
            咨詢電話:400-811-9990
            面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、網絡營銷培訓、好程序員
            認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
          • 千鋒教育服務號

            了解千鋒動態
            關注千鋒教育服務號

          • 千鋒教育移動站

            掃一掃快速進入
            千鋒移動端頁面

          • 千鋒互聯服務號

            掃碼匿名提建議
            直達CEO信箱

          [an error occurred while processing the directive] 日韩亚洲AV人人夜夜澡人人爽
          <pre id="13q3s"><s id="13q3s"><menu id="13q3s"></menu></s></pre>
                <tr id="13q3s"><s id="13q3s"></s></tr>