黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

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

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

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

當前位置:首頁  >  技術干貨  > 爆破專欄丨Spring Security系列教程解決Spring Security環境中的跨域問題

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

來源:千鋒教育
發布人:qyf
時間: 2021-10-29 11:40:00 1635478800

  原創:千鋒一一哥

  前言

  上一章節中,一一哥 給各位講解了同源策略和跨域問題,以及跨域問題的解決方案,在本篇文章中,我會帶大家進行代碼實現,看看在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) 跨站請求偽造。跨站請求偽造也被稱為 one-click attack 或者 session riding,通常縮寫為 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

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
日本免费区| 亚欧成人毛片一区二区三区四区| 国产极品精频在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品国产一区二区三区精东影业 | 国产成人啪精品视频免费软件| 九九精品在线| 精品国产一区二区三区久 | 可以免费看毛片的网站| 国产网站免费| 欧美激情一区二区三区在线播放| 成人影院一区二区三区| 韩国毛片免费大片| 国产视频一区二区在线观看| 99热精品在线| 四虎精品在线观看| 午夜激情视频在线播放| 午夜激情视频在线播放| 超级乱淫黄漫画免费| 午夜欧美福利| 国产精品自拍在线| 黄视频网站免费看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产a视频| 日本特黄特色aaa大片免费| a级毛片免费观看网站| 国产伦精品一区三区视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产国产人免费视频成69堂| 天天做人人爱夜夜爽2020毛片| 青青久久精品| 久久国产精品自由自在| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 99久久精品国产麻豆| 国产网站免费观看| 天天色色色| 色综合久久天天综线观看| 日韩在线观看视频黄| 99久久网站| 国产高清视频免费| 二级特黄绝大片免费视频大片| 91麻豆精品国产片在线观看| 99久久精品国产国产毛片| 超级乱淫伦动漫| 黄视频网站免费| 色综合久久天天综合观看| 精品国产一区二区三区免费| 日日夜夜婷婷| 精品在线观看国产| 日韩免费在线观看视频| 成人免费一级纶理片| 国产一区二区精品| 亚洲 国产精品 日韩| 台湾毛片| 精品久久久久久免费影院| 99久久精品国产国产毛片| 国产一区二区精品久| 尤物视频网站在线观看| 国产综合成人观看在线| a级毛片免费观看网站| 四虎影视久久| 国产不卡福利| 国产成+人+综合+亚洲不卡| 毛片电影网| 日韩一级黄色| 国产网站免费| 国产福利免费视频| 美女免费毛片| 亚洲女初尝黑人巨高清在线观看| 日韩av成人| 国产伦理精品| 国产成人啪精品视频免费软件| 黄视频网站免费看| 九九久久国产精品大片| 日韩中文字幕一区二区不卡| 国产高清在线精品一区二区| 精品国产一区二区三区精东影业 | 国产视频网站在线观看| 色综合久久天天综合| 久久精品欧美一区二区| 精品久久久久久免费影院| 成人a大片高清在线观看| 日本在线不卡视频| 欧美激情影院| 午夜欧美福利| 国产美女在线观看| 精品国产香蕉在线播出| 免费国产在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩一级黄色| 在线观看成人网 | 中文字幕一区二区三区精彩视频| 精品视频在线看| 中文字幕一区二区三区精彩视频 | 欧美激情在线精品video| 九九免费高清在线观看视频| 日韩专区第一页| 午夜激情视频在线播放| 免费毛片播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 高清一级片| 日韩av东京社区男人的天堂| 久久国产一区二区| 尤物视频网站在线观看| 91麻豆爱豆果冻天美星空| 国产高清视频免费观看| 精品久久久久久中文字幕一区 | 免费一级生活片| 日韩免费在线视频| 成人高清护士在线播放| 毛片电影网| 99热精品在线| 999精品在线| 免费国产在线视频| 久久久久久久免费视频| 青草国产在线| 久久久久久久久综合影视网| 亚洲天堂免费观看| 亚洲女初尝黑人巨高清在线观看| 韩国三级一区| 欧美α片无限看在线观看免费| 成人a级高清视频在线观看| 麻豆网站在线看| 精品国产一区二区三区久| 国产91精品一区二区| 国产麻豆精品免费密入口| 日本特黄特黄aaaaa大片| 日韩一级精品视频在线观看| 国产不卡福利| 国产不卡在线播放| 欧美激情一区二区三区在线| 精品在线视频播放| 沈樵在线观看福利| 99久久精品国产高清一区二区 | 欧美日本二区| 欧美国产日韩一区二区三区| 美女免费黄网站| 国产亚洲男人的天堂在线观看| 中文字幕一区二区三区 精品| 成人影视在线播放| 午夜激情视频在线观看| 亚洲精品影院| 亚洲女初尝黑人巨高清在线观看| 可以免费在线看黄的网站| 国产不卡精品一区二区三区| 高清一级片| 日韩字幕在线| 精品国产亚洲一区二区三区| 国产成人女人在线视频观看 | 久久国产影视免费精品| 美女免费毛片| 天天做日日干| 欧美a级片视频| 久久久久久久网| 韩国三级视频网站| 四虎影视库国产精品一区| 天堂网中文字幕| 精品在线观看国产| 成人免费网站久久久| 欧美日本二区| 久久国产精品自线拍免费| 99热热久久| 99色视频在线观看| 欧美一级视| 黄视频网站在线免费观看| 亚洲 欧美 91| 国产一级生活片| 国产一区二区精品久| 国产亚洲精品成人a在线| 日韩av片免费播放| 韩国三级视频网站| 毛片高清| 免费的黄色小视频| 久久精品道一区二区三区| 欧美激情在线精品video| 亚洲精品影院| 久久99欧美| 九九久久99| 一级女性全黄久久生活片| 国产欧美精品| 一级女性大黄生活片免费| 久草免费在线色站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 九九热国产视频| 四虎论坛| 精品视频在线观看一区二区 | 九九热国产视频| 免费国产在线视频| 日韩专区亚洲综合久久| 日本特黄特色aa大片免费| 美女免费黄网站| 日本特黄特黄aaaaa大片| 黄视频网站在线看| 免费的黄色小视频| 日韩一级黄色| 国产精品免费精品自在线观看| 美女免费精品高清毛片在线视| 韩国三级香港三级日本三级| 97视频免费在线| 九九精品在线|