SpringSecurity-2.7中跨域問題解析
SpringSecurity-2.7中跨域問題
訪問測試
起因
寫這篇的起因是會了解到
SSM(@CrosOrigin)
解決跨域,但是會在加入SpringSecurity
配置后,這個跨域解決方案就失效了,而/login
這個請求上是無法添加這個注解
或者通過配置(WebMvcConfig)
去解決跨域,所以只能使用SpringSecurity
提供的.cros()
去解決跨域,但是在學習過程中,如果稍微粗心,可能會出現(xiàn)跨域不通的問題,而以下將會說明SpringSecurity
是如何配置跨域的
Postman
發(fā)起的請求不屬于異步請求(區(qū)分前后端分離的JSON
)
使用axios
發(fā)起異步請求,
<!-- 前端: 使用 Live Server 啟動訪問 http://127.0.0.1:5500/index.html 后端: localhost:8080/login --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <button id="btn">發(fā)起異步請求</button> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script> let btnEl = document.querySelector('#btn'); btnEl.onclick = function () { console.log('click......................'); axios({ url: 'http://localhost:8080/login', method: 'post', data: { username: 'zhangsan', password: '123456', }, }).then((res) => { console.log(res); }); }; </script> </body> </html>
請求測試
SpringSecurity-配置
config
// 【/login】需要顯示的聲明出來,在前后端分離中,本文沒有采用的是 ajax 向后端發(fā)送異步請求 @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { /** * 請求配置 * authorizeHttpRequests: 開啟權(quán)限請求管理,針對 http 請求進行授權(quán)配置 * mvcMatchers: 匹配請求 * - permitAll: 代表放行該資源,該資源位公共資源,無需認證和授權(quán)可以直接訪問 * - anyRequest().authenticated(): 代表所有請求,必須認證之后才能訪問 * - formLogin: 代表開啟表單認證 * <strong>放行資源必須放在認證資源之前</strong> */ http.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests // 預(yù)檢請求是怎么知道的:官網(wǎng)中有這樣一段描述,如圖 .antMatchers(HttpMethod.OPTIONS, "/login").permitAll() .anyRequest().authenticated() ); /** * 跨域配置 */ http.cors().configurationSource(corsConfigurationSource()); // WHITELIST 自定義的放行資源數(shù)組, /login不能出現(xiàn)在里面 @Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring().antMatchers(WHITELIST); } } // 此處關(guān)于下方的描述可以不更改,依然使用此配置 @Bean CorsConfigurationSource corsConfigurationSource() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 新建一個跨域配置源 // 你只要點擊 .cors().configurationSource( <- 點擊進入這個方法,查看出這個參數(shù),就明白為什么給了 CorsConfiguration,) CorsConfiguration configuration = new CorsConfiguration(); // 新建一個跨域配置 configuration.setAllowCredentials(true); // 【這個憑證問題,后續(xù)會給出詳細解釋,在 axios 的配置中默認是false,【axios 中 `withCredentials` 表示跨域請求時是否需要使用憑證】瀏覽器是否應(yīng)當發(fā)送憑證信息,如cookie。 configuration.setAllowedMethods(Arrays.asList("*")); // 允許的請求方法,*表示允許所有方法 configuration.setAllowedHeaders(Arrays.asList("*")); // 允許的請求頭,*表示允許所有頭 configuration.setMaxAge(Duration.ofHours(1)); // 預(yù)檢請求的有效期,有效期內(nèi)不必再次發(fā)送,默認是1800秒。 configuration.setAllowedOriginPatterns(Arrays.asList("*"));// 允許的請求源 source.registerCorsConfiguration("/**", configuration); // 注冊跨域配置 return source; }
以上配置其實可以算正確,但是有合規(guī)
在調(diào)試后發(fā)現(xiàn),只需要將
/login
加入(.antMatchers("/login").permitAll()
),在所看到的視頻中的關(guān)于SpringSecurity
的跨域就生效了,也可以不將預(yù)檢
配置出來
到此這篇關(guān)于SpringSecurity-2.7中跨域問題的文章就介紹到這了,更多相關(guān)SpringSecurity跨域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之Integer使用的注意事項及面試題
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)之Integer使用注意事項及面試題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-12-12Java?Web開發(fā)常用框架Spring?MVC?Struts示例解析
這篇文章主要為大家介紹了Java?Web開發(fā)常用框架Spring?MVC?Struts示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06Json字符串與Object、List、Map的互轉(zhuǎn)工具類
今天小編就為大家分享一篇關(guān)于Json字符串與Object、List、Map的互轉(zhuǎn)工具類,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12java?-jar命令及SpringBoot通過java?-jav啟動項目的過程
本篇文章將為大家講述關(guān)于 SpringBoot 項目工程完成后,是如何通過 java-jar 命令來啟動的,以及介紹 java-jar 命令的詳細內(nèi)容,對SpringBoot java?-jav啟動過程感興趣的朋友跟隨小編一起看看吧2023-05-05SpringBoot統(tǒng)計接口調(diào)用耗時的三種方式
在實際開發(fā)中,了解項目中接口的響應(yīng)時間是必不可少的事情,SpringBoot 項目支持監(jiān)聽接口的功能也不止一個,接下來我們分別以 AOP、ApplicationListener、Tomcat 三個方面去實現(xiàn)三種不同的監(jiān)聽接口響應(yīng)時間的操作,需要的朋友可以參考下2024-06-06使用java實現(xiàn)百萬級別數(shù)據(jù)導(dǎo)出excel的三種方式
這篇文章主要介紹了使用java實現(xiàn)百萬級別數(shù)據(jù)導(dǎo)出excel的三種方式,有些業(yè)務(wù)系統(tǒng)可能動輒涉及到百萬上千萬的數(shù)據(jù),用正常的方法效率就變得很低,今天我們來看看這幾種實現(xiàn)思路2023-03-03springboot中Controller內(nèi)文件上傳到本地及阿里云操作方法
這篇文章主要介紹了springboot中Controller內(nèi)文件上傳到本地及阿里云操作方法,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-12-12