vue+springboot前後端分離單點跨域登入
這次帶給大家vue springboot前後端分離單點跨域登錄,vue springboot前後端分離單點跨域登錄的注意事項有哪些,下面就是實戰案例,一起來看一下。
最近在做一個後台管理系統,前端是用時下火熱的vue.js,後台是基於springboot的。因為後台系統沒有登入功能,但是公司要求統一登錄,登入認證統一使用.net專案組的認證系統。那就意味著做單點登入咯,至於不知道什麼是單一登入的同學,建議去找萬能的度娘。
剛接到這個需求的時候,老夫心裡便不屑的認為:區區登入何足掛齒,但是,開發的過程狠狠的打了我一巴掌(火辣辣的一巴掌)。 。 。 ,所以這次必須得好好記錄一下這次教訓,以免以後再踩這樣的坑。
我面臨的第一個問題是跨域,瀏覽器控制台直接報CORS,以我多年開發經驗,我果斷在後台配置了跨域配置,程式碼如下:
@Configuration public class CorsConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedHeaders("*") .allowedMethods("*") .allowedOrigins("*"); } }; } }
這個配置就是允許所有mapping,所有請求頭,所有請求方法,所有來源。改好配置之後我果斷重啟項目,看效果,結果發現根本沒辦法重定向跳到單點登錄頁面,看瀏覽器報錯是跨域導致的,我先上我登錄攔截器的代碼
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //用户已经登录 if (request.getSession().getAttribute("user") != null) { return true; } //从单点登录返回之后的状态,本系统还不处于登录状态 //根据code值去获取access_token,然后再根据access_token去获取用户信息,并将用户信息存到session中 String state = request.getParameter("state"); String uri = getUri(request); if (isLoginFromSSO(state)) { String code = request.getParameter("code"); Object cacheUrl = request.getSession().getAttribute(state); if (cacheUrl == null) { response.sendRedirect(uri); return false; } HttpUtil client = new HttpUtil(); StringBuffer sb = new StringBuffer(); sb.append("code=").append(code) .append("&grant_type=").append("authorization_code") .append("&client_id=").append(SSOAuth.ClientID) .append("&client_secret=").append(SSOAuth.ClientSecret) .append("&redirect_uri=").append(URLEncoder.encode((String) cacheUrl)); String resp = client.post(SSOAuth.AccessTokenUrl, sb.toString()); Map<String, String> map = new Gson().fromJson(resp, Map.class); //根据access_token去获取用户信息 String accessToken = map.get("access_token"); HttpUtil http = new HttpUtil(); http.addHeader("Authorization", "Bearer " + accessToken); String encrypt = http.get(SSOAuth.UserUrl); String userinfo = decryptUserInfo(encrypt); //封装成user对象 User user = new Gson().fromJson(userinfo, User.class); request.getSession().setAttribute("user", user); return true; } //跳转到单点登录界面 state = Const._SSO_LOGIN + Const.UNDERLINE + RandomUtil.getUUID(); request.getSession().setAttribute(state, uri); String redirectUrl = buildAuthCodeUrl(uri, state); response.sendRedirect(redirectUrl); return false; }
後面把前端vue請求後台的登入介面方式直接用
window.location.href=this.$api.config.baseUrl+"/system/user/login"
之後前端存取系統,可以直接跳到單一登入頁面。但是當我輸完帳號和密碼點擊登入後回跳到系統,發現所有的請求資料介面都無法正常訪問,debug發現所有的請求都沒帶用戶信息,被攔截器識別為未登錄,所有請求無法通過。
為什麼我明明登入了呀,攔截器也設定了使用者資訊到session啊,怎麼cookies那就沒了呢?再次發起請求,發現每次請求的JsessionId都不一樣,查了很多資料,發現是需要在前端加一個允許帶認證資訊的配置
axios.defaults.withCredentials=true;
# 後台也需要做一個對應的設定allowCredentials(true);
@Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedHeaders("*") .allowedMethods("*") .allowedOrigins("*").allowCredentials(true); } }; }
加完這個設定之後,重新執行一次操作流程,發現登入之後能正常跳到系統,頁面資料也展示正常。
正當我以為大功告成的時候,突然點到一個頁面又無法正常顯示數據,好納悶啊,趕緊F12,發現一個之前沒見過的請求方式,OPTIONS請求,原來這個請求方式明明是POST呀,怎麼就變成了OPTIONS了呢?於是我有點了其他幾個POST的請求,發現都變成了OPTIONS請求,一臉懵逼的我趕緊查了一下OPTIONS請求的資料,網上說OPTIONS請求叫做“預檢查請求”,就是在你的正式在請求執行前,瀏覽器會先發起預檢查請求,預檢查請求通過了,才能執行正式請求。看完恍然大悟,原來OPTIONS被攔截了,所以沒辦法再執行我的POST的請求啊,那我直接讓預檢查請求通過就好了。只要在攔截器中加一個這個判斷就好了
//option预检查,直接通过请求 if ("OPTIONS".equals(request.getMethod())){ return true; }
這樣攔截器發現請求是預檢查請求就直接通過,就可以執行接下來的POST的請求了。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是vue+springboot前後端分離單點跨域登入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

隨著社群媒體的快速發展,小紅書成為許多年輕人分享生活、探索新產品的熱門平台。在使用過程中,有時使用者可能會遇到登入先前帳號的困難。本文將詳細探討如何解決小紅書登入舊帳號的問題,以及如何應對更換綁定後可能遺失原帳號的情況。一、小紅書怎麼登入以前的帳號? 1.找回密碼登入如果長時間未登入小紅書,可能導致帳號被系統回收。為了恢復存取權限,你可以嘗試透過找回密碼的方式重新登入帳號。操作步驟如下:(1)開啟小紅書App或官網,點選「登入」按鈕。 (2)選擇「找回密碼」。 (3)輸入你註冊帳號時所使用的手機號碼

當你在自己電腦上登過別人steam帳號之後,剛好這個別人的帳號也有wallpaper軟體,切換回自己帳號之後steam就會自動下載別人帳號訂閱的桌布,使用者可以透過關閉steam雲端同步解決。 wallpaperengine登入別的號碼後下載別人的桌布怎麼辦1、登陸你自己的steam帳號,在設定裡面找到雲端同步,關閉steam雲端同步。 2.登陸你之前登陸的別人的steam帳號,打開wallpaper創意工坊,找到訂閱內容,然後取消全部訂閱。 (以後防止找不到壁紙,可以先收藏再取消訂閱)3、切換回自己的stea

山野間萬鬼嘶鳴,隱沒兵刃交接之聲,越嶺奔赴而來的鬼將,心中戰意洶湧,以炎火為號,率百鬼衝鋒迎戰。 【熾焱百煉•茨木童子典藏皮膚上線】鬼角熾焰怒燃,鎏金眼眸迸發桀駿戰意,白玉甲片裝飾戰袍,彰顯大妖不羈狂放的氣勢。雪白飄揚的袖擺上,赤焰攀附交織,金紋烙印其中,燃點一片緋艷妖異色彩。妖力凝聚而成的鬼火咆哮而至,烈焰令群巒為之震動,煉獄間歸來的妖鬼啊,一同懲戒進犯之人吧。 【專屬動態頭像框•熾焱百煉】【專屬插畫•焰火將魂】【傳記鑑賞】【獲取方式】茨木童子典藏皮膚·熾焱百煉將於12月28日維護後上架皮膚商店,

Discuz後台登入問題解決方法大揭秘,需要具體程式碼範例隨著網路的快速發展,網站建置變得越來越普遍,而Discuz作為一款常用的論壇建站系統,受到了許多站長的青睞。然而,正是因為其功能強大,有時候我們在使用Discuz的過程中會遇到一些問題,例如後台登入問題。今天,我們就來大揭秘Discuz後台登入問題的解決方法,並且提供具體的程式碼範例,希望能幫助到有需要

近日有一些小夥伴諮詢小編快手電腦版怎麼登入?下面就為大家帶來了快手電腦版的登入方法,有需要的小夥伴可以來了解了解哦。第一步:先在電腦的瀏覽器上百度搜尋快手官網。第二步:在搜尋結果清單裡面選取第一條。第三步:進入快手官網主頁面後,點選影片的選項。第四步:點選右上角的使用者頭像。步驟五:在彈出的登入選單裡面點選二維碼登入。步驟六:之後打開手機上的快手,點選左上角的圖示。第七步:點選二維碼標誌。第八步:在我的二維碼介面點擊右上角的掃描圖示之後,掃描電腦上的二維碼即可。第九步:最後電腦版的快手就登入成

GitHubCopilot是編碼人員的下一個級別,它基於AI的模型可以成功預測和自動完成您的程式碼。但是,您可能想知道如何在您的裝置上加入這個AI天才,以便您的編碼變得更加容易!但是,使用GitHub並不是很容易,初始設定過程是一個棘手的過程。因此,我們創建了這個逐步教程,介紹如何在Windows11、10上的VSCode中安裝和實作GitHubCopilot。如何在Windows上安裝GitHubCopilot此過程有幾個步驟。因此,請立即執行以下步驟。步驟1–您必須在電腦上安裝最新版本的可視

電腦版微信登入不了是由於網路連線問題、帳號密碼輸入錯誤、微信伺服器故障、作業系統或應用程式問題、帳號被封鎖或異常登入等原因所導致。詳細介紹:1、網路連線問題,嘗試重新連接網路或更換網路環境;2、帳號密碼輸入錯誤,嘗試使用手機版微信登入確認帳號與密碼是否正確;3、微信伺服器故障,嘗試等待一段時間後再次嘗試登入;4、作業系統或應用程式問題,嘗試更新作業系統或微信應用程式等。

百度網盤不僅能儲存各種軟體資源,還能分享給別人,支援多端同步,如果你的電腦沒有下載客戶端,可以選擇進入網頁版使用。那麼百度網盤網頁版要怎麼登入呢?下面就來看看詳細介紹。 百度網盤網頁版登入入口:https://pan.baidu.com(複製連結至瀏覽器開啟) 軟體介紹 1、分享 提供文件分享功能,使用者將文件整理,分享給需要的小夥伴。 2、雲端 不佔用太多內存,大多數檔案都保存在雲端,有效節省電腦空間。 3、相簿 支援雲相簿功能,將照片匯入到雲盤中,然後整理,方便大家查看。
