springboot簡(jiǎn)單實(shí)現(xiàn)單點(diǎn)登錄的示例代碼
什么是單點(diǎn)登錄就不用再說(shuō)了,今天通過(guò)自定義sessionId來(lái)實(shí)現(xiàn)它,想了解的可以參考https://www.xuxueli.com/xxl-sso/
講一下大概的實(shí)現(xiàn)思路吧:這里有一個(gè)認(rèn)證中心,兩個(gè)單獨(dú)的服務(wù)。每個(gè)服務(wù)去請(qǐng)求的 時(shí)候都要經(jīng)過(guò)一個(gè)過(guò)濾器,首先判斷該請(qǐng)求地址中有沒(méi)有sessionid,有的話則寫(xiě)入cookie ,如果請(qǐng)求地址中沒(méi)有sessionid那么從cookie中去獲取,如果cookie中獲取到了則證明登錄了,放行即可。否則跳轉(zhuǎn)到認(rèn)證中心,此時(shí)把請(qǐng)求地址當(dāng)做參數(shù)帶到認(rèn)證中,認(rèn)證中心認(rèn)證成功后把sessionid寫(xiě)入cookie,同時(shí)重定向帶過(guò)來(lái)的地址,并且把sessionid拼接上。一般直接在認(rèn)證中心認(rèn)證過(guò)后,直接訪問(wèn)其他系統(tǒng)地址是不會(huì)攔截該請(qǐng)求的,所以這個(gè)時(shí)候可以在跳轉(zhuǎn)到認(rèn)證頁(yè)面的時(shí)候先判斷認(rèn)證中心這邊有沒(méi)有sessionid,有的話,直接返回,否則再進(jìn)入認(rèn)證頁(yè)面。
語(yǔ)言表達(dá)不清楚,下面先來(lái)幾張圖壓壓驚,看看效果。
沒(méi)有登錄前我訪問(wèn):http://127.0.0.1:2000/client1
直接跳轉(zhuǎn)到認(rèn)證頁(yè)面了
認(rèn)證成功后
由于我這client系統(tǒng)中登陸過(guò)了,所以我直接訪問(wèn)client2,不用登錄直接出現(xiàn)了效果
我接下來(lái)直接先去認(rèn)證中心登錄一下
此時(shí)訪問(wèn):http://127.0.0.1:2000/client1
效果演示完畢了,下面上代碼
Client1代碼:
@Controller public class Client1Controller { @GetMapping("/client1") public String client1(){ return "client1"; } }
import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class Client1Filter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; String parameter = request.getParameter("sso-sessionId"); if(StringUtils.isNotEmpty(parameter)){ Cookie cookie = new Cookie("sso-sessionId", parameter); cookie.setPath("/"); response.addCookie(cookie); } String token=""; Cookie[] cookies = request.getCookies(); if(cookies!=null){ for(Cookie cookie:cookies){ String name = cookie.getName(); if(name.equals("sso-sessionId")){ token = cookie.getValue(); } } } if(StringUtils.isEmpty(token)){ response.sendRedirect("http://127.0.0.1:4000/login?return_url="+request.getRequestURL()); return; } chain.doFilter(servletRequest,servletResponse); } }
由于Client2代碼和Client1代碼基本一直,所以就不貼上了
認(rèn)證中心代碼
import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.UUID; @Controller public class ServerController { @GetMapping("/login") public String login(String return_url, HttpServletRequest request,HttpServletResponse response) throws IOException { String token=null; Cookie[] cookies = request.getCookies(); if(cookies!=null){ for(Cookie cookie:cookies){ String name = cookie.getName(); if(name.equals("sso-sessionId")){ System.out.println(cookie); token = cookie.getValue(); } } } if(StringUtils.isNotEmpty(return_url)){ if(StringUtils.isNotEmpty(token)){ return_url=return_url+"?sso-sessionId="+token; response.sendRedirect(return_url); } } request.setAttribute("return_url",return_url); return "login"; } @GetMapping("/success") public String success(){ return "success"; } @PostMapping("/doLogin") //@ResponseBody public void doLogin(String userName, String passWord, String return_url, HttpServletResponse response) throws IOException { String token = UUID.randomUUID().toString().replace("-",""); Cookie cookie = new Cookie("sso-sessionId", token); cookie.setPath("/"); response.addCookie(cookie); if(StringUtils.isEmpty(return_url)) { response.sendRedirect("http://127.0.0.1:4000/success"); }else{ return_url=return_url+"?sso-sessionId="+token; response.sendRedirect(return_url); } } }
這樣的話,一個(gè)簡(jiǎn)單的單點(diǎn)登錄就完成了,至于擴(kuò)展優(yōu)化,自行發(fā)揮了
到此這篇關(guān)于springboot簡(jiǎn)單實(shí)現(xiàn)單點(diǎn)登錄的示例代碼的文章就介紹到這了,更多相關(guān)springboot 單點(diǎn)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例
- springboot 集成cas5.3 實(shí)現(xiàn)sso單點(diǎn)登錄詳細(xì)流程
- springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼
- SpringBoot整合SSO(single sign on)單點(diǎn)登錄
- SpringBoot+Vue+Redis實(shí)現(xiàn)單點(diǎn)登錄(一處登錄另一處退出登錄)
- 使用springboot結(jié)合vue實(shí)現(xiàn)sso單點(diǎn)登錄
- 基于springboot和redis實(shí)現(xiàn)單點(diǎn)登錄
- 單點(diǎn)登錄的概念及SpringBoot實(shí)現(xiàn)單點(diǎn)登錄的操作方法
相關(guān)文章
詳解Spring?Security?捕獲?filter?層面異常返回我們自定義的內(nèi)容
Spring?的異常會(huì)轉(zhuǎn)發(fā)到?BasicErrorController?中進(jìn)行異常寫(xiě)入,然后才會(huì)返回客戶端。所以,我們可以在?BasicErrorController?對(duì)?filter異常進(jìn)行捕獲并處理,下面通過(guò)本文給大家介紹Spring?Security?捕獲?filter?層面異常,返回我們自定義的內(nèi)容,感興趣的朋友一起看看吧2022-05-05Java調(diào)用ChatGPT(基于SpringBoot和Vue)實(shí)現(xiàn)可連續(xù)對(duì)話和流式輸出的ChatGPT API
這篇文章主要介紹了Java調(diào)用ChatGPT(基于SpringBoot和Vue),實(shí)現(xiàn)可連續(xù)對(duì)話和流式輸出的ChatGPT API(可自定義實(shí)現(xiàn)AI助手),文中代碼示例介紹的非常詳細(xì),感興趣的朋友可以參考下2023-04-04java線程之使用Runnable接口創(chuàng)建線程的方法
本篇文章介紹了,java中使用Runnable接口創(chuàng)建線程的方法。需要的朋友參考下2013-05-05Spring使用注解存儲(chǔ)Bean對(duì)象的方法詳解
在使用學(xué)習(xí)使用 Spring過(guò)程中,當(dāng)我們要實(shí)現(xiàn)一個(gè)功能的時(shí)候,先應(yīng)該考慮的是有沒(méi)有相應(yīng)的注解是實(shí)現(xiàn)對(duì)應(yīng)功能的,Spring 中很多功能的配置都是可以依靠注解實(shí)現(xiàn)的,而本篇中介紹的是使用注解來(lái)存儲(chǔ) Bean 對(duì)象2023-07-07Java圖形化編程之JFrame疫苗接種系統(tǒng)詳解
GUI圖形界面設(shè)計(jì)是用戶和程序交互的工具,用戶通過(guò)圖形界面控制程序事件的發(fā)生。首先介紹Swing的基本體系結(jié)構(gòu),這是底層2021-09-09Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過(guò)程解析
這篇文章主要介紹了Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03java使用mysql預(yù)編譯語(yǔ)句查詢(xún)優(yōu)勢(shì)及示例詳解
這篇文章主要為大家介紹了java使用mysql預(yù)編譯語(yǔ)句的優(yōu)勢(shì)特點(diǎn)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06idea?maven依賴(lài)引入失效無(wú)法正常導(dǎo)入依賴(lài)問(wèn)題的解決方法
有時(shí)候idea導(dǎo)入一個(gè)新項(xiàng)目,或者pom文件修改(新增)了依賴(lài),pom文件和代碼會(huì)報(bào)紅,提示依賴(lài)包不存在,下面這篇文章主要給大家介紹了關(guān)于idea?maven依賴(lài)引入失效無(wú)法正常導(dǎo)入依賴(lài)問(wèn)題的解決方法,需要的朋友可以參考下2023-04-04SpringBoot超詳細(xì)講解自動(dòng)配置原理
在進(jìn)行項(xiàng)目編寫(xiě)前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手2022-06-06