springboot簡單實現單點登錄的示例代碼

什麼是單點登錄就不用再說瞭,今天通過自定義sessionId來實現它,想瞭解的可以參考https://www.xuxueli.com/xxl-sso/

講一下大概的實現思路吧:這裡有一個認證中心,兩個單獨的服務。每個服務去請求的 時候都要經過一個過濾器,首先判斷該請求地址中有沒有sessionid,有的話則寫入cookie ,如果請求地址中沒有sessionid那麼從cookie中去獲取,如果cookie中獲取到瞭則證明登錄瞭,放行即可。否則跳轉到認證中心,此時把請求地址當做參數帶到認證中,認證中心認證成功後把sessionid寫入cookie,同時重定向帶過來的地址,並且把sessionid拼接上。一般直接在認證中心認證過後,直接訪問其他系統地址是不會攔截該請求的,所以這個時候可以在跳轉到認證頁面的時候先判斷認證中心這邊有沒有sessionid,有的話,直接返回,否則再進入認證頁面。
語言表達不清楚,下面先來幾張圖壓壓驚,看看效果。

沒有登錄前我訪問:http://127.0.0.1:2000/client1 直接跳轉到認證頁面瞭

在這裡插入圖片描述

認證成功後

在這裡插入圖片描述

由於我這client系統中登陸過瞭,所以我直接訪問client2,不用登錄直接出現瞭效果

在這裡插入圖片描述

我接下來直接先去認證中心登錄一下

在這裡插入圖片描述

此時訪問: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代碼基本一直,所以就不貼上瞭

認證中心代碼

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);
        }
    }
}

這樣的話,一個簡單的單點登錄就完成瞭,至於擴展優化,自行發揮瞭

到此這篇關於springboot簡單實現單點登錄的示例代碼的文章就介紹到這瞭,更多相關springboot 單點登錄內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: