最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java單點(diǎn)登錄(SSO)的實(shí)現(xiàn)

 更新時間:2021年07月15日 09:43:03   作者:瘋狂打碼  
SSO是指在多個應(yīng)用系統(tǒng)中個,用戶只需要登陸一次就可以訪問所有相互信任的應(yīng)用系統(tǒng),本文主要介紹了java單點(diǎn)登錄的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下

單點(diǎn)登錄(SSO):SSO是指在多個應(yīng)用系統(tǒng)中個,用戶只需要登陸一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。它包括可以將這次主要的登錄映射到其他應(yīng)用中用于同一用戶的登陸的機(jī)制。

SSO的實(shí)現(xiàn)過程:

通過上述圖形,我們可以看到SSO的大體實(shí)現(xiàn)步驟主要分為兩大步:存儲登錄信息,查驗(yàn)登錄信息。

對于SSO,我們也可以將之分為兩大不同的類型:同域SSO和跨域SSO;其中同域SSO又可以分為完全同域SSO和同父域SSO。

一、完全同域SSO:指的是域名完全相同的多個應(yīng)用系統(tǒng)中實(shí)現(xiàn)單點(diǎn)登錄。

其實(shí)現(xiàn)步驟主要分為:前期準(zhǔn)備工作,編寫統(tǒng)一登錄接口,編寫登錄校驗(yàn)接口,編寫驗(yàn)證頁面,實(shí)現(xiàn)SSO;

編寫統(tǒng)一登錄接口:
登錄頁面的編寫主要是錄入用戶的登錄信息,包括用戶名,密碼,以及登錄頁面的地址。因?yàn)榇嬖诙鄠€應(yīng)用系統(tǒng),所以用戶在統(tǒng)一登錄頁面登陸成功后,系統(tǒng)需要知道用戶想要訪問的是哪個系統(tǒng)頁面,這個時候就需要記錄用戶第一次訪問的地址,等到用戶登錄成功后,就可直接跳轉(zhuǎn)該頁面。

<body>
    <center>
        <h1>請登錄</h1>
        <form action="/sso/doLogin.action" method="POST">
            <span>用戶名:</span><input type="text" name="username" />
            <span>密碼:</span><input type="text" name="password" />
            //暫存需要登錄頁面的url地址
            <input type="hidden" name="gotoUrl" value="${gotoUrl}" />
            <input type="submit" />
        </form>
    </center>
</body>

登錄方法的編寫:需要新建cookie,將用戶的信息存進(jìn)cookie中,并指定cookie的路徑,因?yàn)槭峭耆颍詂ookie的地址可以簡寫為(“/”)。這里必須要設(shè)置cookie的路徑,如果不設(shè)置,那么cookie的路徑將并不一定在當(dāng)前域名的頂層,它有可能就在當(dāng)前的這個路徑下才可見,這樣會導(dǎo)致在當(dāng)前域的其他路徑下找不到這個cookie,解決辦法就是把cookie設(shè)置到當(dāng)前域的最頂層域里面,這樣當(dāng)前域下的所有應(yīng)用就會都可見。

public String doLogin(){
        //新建Cookie
        Cookie cookie = new Cookie("ssocookie","sso");
        //設(shè)置Cookie路徑
        cookie.setPath("/");
        HttpServletResponse response = ServletActionContext.getResponse();
        response.addCookie(cookie);
        return "success";
 }

登錄校驗(yàn)接口的編寫:通常SSO登錄接口校驗(yàn)都會放在登錄攔截器中,當(dāng)用戶想要訪問某個系統(tǒng)時,登錄攔截器將直接重定向到統(tǒng)一登錄頁面,用戶填寫完登錄信息后,就會進(jìn)行登錄校驗(yàn)。

//cookie校驗(yàn)(放在攔截器中進(jìn)行校驗(yàn))
    public static boolean checkCookie(HttpServletRequst request){
        Cookie[] cookies=request.getCookies();
        if(cookies!=null){
            for(Cookies cookie:cookies){
                if(cookie.getName().equals("ssocookie")
                        &&cookie.getValue().equals("sso")){
                    return true;
                }
            }
        }
        return false;
  }

編寫測試主頁

public String main(){
        HttpServletRequst request = ServletActionContext.getRequst();
        if(SSOCheck.checkCookie(request)){
            //登陸成功,記錄用戶登錄信息......
            return "success";
        }
        //登錄失敗,暫存需要訪問的地址,登錄成功后,直接訪問該地址
        gotoUrl="/demo1/main.action";
        return "login";
 }

最后還有struts2的配置文件

<struts>
    <package name="sso" namespace="/sso" extends="struts-default">
        <action name="doLogin" class="com.xm.controllerAction.SSOAction" method="doLogin">
       <!-- 用戶登錄成功后,需要進(jìn)行重定向,重新跳轉(zhuǎn)到用戶最初訪問的路徑 -->  
            <result name="success" type="redirect">${gotoUrl}</result>
        </action>
    </package>
    
    <package name="demo1" namespace="/demo1" extends="struts-default">
        <action name="main" class="com.xm.controllerAction.Demo1Action" method="main">
            <result name="success">/success1.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </package>
    <package name="demo2" namespace="/demo2" extends="struts-default">
        <action name="main" class="com.xm.controllerAction.Demo2Action" method="main">
            <result name="success">/success2.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </package>
</struts>

二、同父域SSO:指的是父域名相同的應(yīng)用系統(tǒng)上實(shí)現(xiàn)SSO。

其實(shí)現(xiàn)步驟與上述完全同域SSO相同。

其中檢驗(yàn)域名:http://check.x.com

測試頁面域名:http://demo1.x.com和http://demo2.x.com

編寫統(tǒng)一登錄接口:
代碼實(shí)現(xiàn)與完全同域名SSO基本一致,不過在設(shè)置提交路徑時,因?yàn)槎売蛎煌圆荒軐懗上鄬β窂?,需要寫成絕對路徑地址。

<body>
    <center>
        <h1>請登錄</h1>
     //表單提交地址需寫成絕對路徑,不能寫相對路徑
        <form action="http://check.x.com/sso/doLogin.action" method="POST">
            <span>用戶名:</span><input type="text" name="username" />
            <span>密碼:</span><input type="text" name="password" />
            //暫存需要登錄頁面的url地址
            <input type="hidden" name="gotoUrl" value="${gotoUrl}" />
            <input type="submit" />
        </form>
    </center>
</body>

登錄方法:在設(shè)置cookie路徑的時候有所變化,同上,為了使得當(dāng)前兩個同父域的應(yīng)用系統(tǒng)都可見這個cookie,那么我們需要將這個cookie設(shè)置到父域下面,而不應(yīng)該設(shè)置到本域下面,這樣才可以實(shí)現(xiàn)域不同,但是父域相同的應(yīng)用都可以看到的這個cookie。

   public String doLogin(){
     boolean ok = SSOCheck.checkLogin(userName,passWord);
     if(ok){
          //新建Cookie
          Cookie cookie = new Cookie("ssocookie","sso");
          //設(shè)置Cookie的父域
          cookie.setDomain(".x.com");
          //設(shè)置Cookie路徑
          cookie.setPath("/");
          HttpServletResponse response = ServletActionContext.getResponse();
          response.addCookie(cookie);
          return "success";
     }
  }

登錄校驗(yàn)接口:因?yàn)橛兄煌挠?,所以我們?yīng)該將登錄所獲得cookie傳到專門的校驗(yàn)域下的校驗(yàn)方法中進(jìn)行校驗(yàn),否則我們需要在各自不同的登錄頁面實(shí)現(xiàn)校驗(yàn),這樣顯得代碼十分的冗余。

    private String cookieName;
    private String cookieValue;
    public String getCookieName() {
      return cookieName;
    }
    public void setCookieName(String cookieName) {
      this.cookieName = cookieName;
    }
    public String getCookieValue() {
      return cookieValue;
    }
    public void setCookieValue(String cookieValue) {
      this.cookieValue = cookieValue;
    }


   //二級域名向二級域名發(fā)送請求
    public void checkCookie() throws IOException{
        boolean ok=SSOCheck.checkCookie(cookieName,cookieValue);
        String result="0";
        if(ok){
            result="1";
        }
        HttpServletResponse response = ServletActionContext.getResponse();
        response.getWriter().print(result);
        response.getWriter().close();
    }


public static boolean checkCookie(String cookieName,String cookieValue){
        if(cookieName.equals("ssocookie")&&cookieValue.equals("sso")){
            return true;
        }
        return false;
    }

編寫測試主頁

public String main(){
        HttpServletRequst request = ServletActionContext.getRequst();
     //獲取cookie
        Cookie[] cookies=request.getCookies();
        if(cookies!=null){
            for(Cookie cookie:cookies){
                if(cookie.getName().equals("ssocookie")){
            //向檢驗(yàn)服務(wù)器中發(fā)送cookieName和cookieValue
                    String result = Demo1Tool.doGet("http://check.x.com/so/checkCookie.action",
                            cookie.getName(),cookie.getValue());
                    if(result.equals("1")){
                        return "success";
                    }
                }
            }
        }
        //暫存需要訪問的地址,登錄成功后,直接訪問該地址
        gotoUrl="http://demo1.x.com/demo1/main.action";
        return "login";
}

public static String doGet(String url,String cookieName,String cookieValue){
        //定義返回值
        StringBuffer sb = new StringBuffer();
        HttpURLConnection httpURLConnection = null;
        try{
            //校驗(yàn)方法所在的地址
            URL urls = new URL(url+
                    "?cookieName="+cookieName+"&cookieValue="+cookieValue);
            //打開連接
            httpURLConnection = (HttpURLConnection) urls.openConnection();
            //設(shè)置打開連接的方法
            httpURLConnection.setRequestMethod("GET");
            //開始連接
            httpURLConnection.connect();
            InputStream in = httpURLConnection.getInputStream();
            InputStreamReader isr = new InputStreamReader(in);
            BufferedReader br = new BufferedReader(isr);
            String temp = null;
            while((temp = br.readLine())!=null){
                sb.append(temp);
            }
            br.close();
            isr.close();
            in.close();
        } catch(IOException e){
            e.printStackTrace();
        } finally{
            if(httpURLConnection!=null){
                httpURLConnection.disconnect();
            }
        }
        return sb.toString();
}

struts配置文件

<struts>
    <package name="sso" namespace="/sso" extends="struts-default">
        <action name="doLogin" class="com.xm.controllerAction.SSOAction" method="doLogin">
            <result name="success" type="redirect">${gotoUrl}</result>
        </action>
        <action name="checkCookie" class="check.x.com.SSOAction" method="checkCookie">
        </action>
    </package>
    <package name="demo1" namespace="/demo1" extends="struts-default">
        <action name="main" class="demo1.x.com.Demo1Action" method="main">
            <result name="success">/success1.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </package>
    <package name="demo2" namespace="/demo2" extends="struts-default">
        <action name="main" class="demo2.x.com.Demo2Action" method="main">
            <result name="success">/success2.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </package>
</struts>

三、跨域SSO:在域名完全不同的應(yīng)用程序上實(shí)現(xiàn)SSO。

其實(shí)現(xiàn)步驟與完全同域SSO相同。

其中檢驗(yàn)域名:http://www.x.com

測試頁面域名:http://www.a.com和http://www.b.com

編寫統(tǒng)一登錄接口:

<body>
    <center>
        <h1>請登錄</h1>
        //這里需要向當(dāng)前所在的域提交申請,因?yàn)槿绻蛐r?yàn)域提交申請,那么在本域中將無法看到cookie
        <form action="/${path}/doLogin.action" method="POST">
            <span>用戶名:</span><input type="text" name="username" />
            <span>密碼:</span><input type="text" name="password" />
            //暫存需要登錄頁面的url地址
            <input type="hidden" name="gotoUrl" value="${gotoUrl}" />
            <input type="submit" />
        </form>
    </center>
</body>

登錄方法:

public String doLogin(){
        Map<String,String> map = new HashMap<String,String>();
        map.put("userName", userName);
        map.put("password", passWord);
        String result = Demo1Tool.doGet("http://www.x.com/sso/doLogin.action",map);
        if(result.equals("1")){
            return "success";
        }
        return "login";
}

public void doLogin() throw IOException{
        boolean ok=SSOCheck.checkCookie(cookieName,cookieValue);
        String result = "0";
        if(ok){
            result = "1";
        }
        HttpServletResponse response = ServletActionContext.getResponse();
        response.getWriter().print(result);
        response.getWriter().close();
}

登錄校驗(yàn)接口;和同父域SSO的登錄校驗(yàn)基本一致,沒有什么變化。

public void checkCookie() throws IOException{
        boolean ok=SSOCheck.checkCookie(cookieName,cookieValue);
        String result="0";
        if(ok){
            result="1";
        }
        HttpServletResponse response = ServletActionContext.getResponse();
        response.getWriter().print(result);
        response.getWriter().close();
}

編寫測試主頁

public String main(){
        HttpServletRequst request = ServletActionContext.getRequst();
        Cookie[] cookies=request.getCookies();
        if(cookies!=null){
            for(Cookie cookie:cookies){
                if(cookie.getName().equals("ssocookie")){
                    Map<String,String> map = new HashMap<String,String>();
                    map.put("userName", cookie.getName());
                    map.put("password", cookie.getValue());
                    String result = Demo1Tool.doGet("http://www.x.com/so/checkCookie.action",
                            cookie.getName(),cookie.getValue());
                    if(result.equals("1")){
                        return "success";
                    }
                }
            }
        }
        //暫存需要訪問的地址,登錄成功后,直接訪問該地址
        path = "demo1";
        gotoUrl="http://www.a.com/demo1/main.action";
        return "login";
    }

public static String doGet(String url,Map<String,String> map){
        //定義返回值
        StringBuffer sb = new StringBuffer();
        HttpURLConnection httpURLConnection = null;
        try{
            StringBuffer t_s = new StringBuffer(url).append("?");
            for(Map.Entry<String, String> entry:map.entrySet()){
                t_s.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                
            }
            url = t_s.substring(0,t_s.length()-1);
            //校驗(yàn)方法所在的地址
            URL urls = new URL(url);
            //打開連接
            httpURLConnection = (HttpURLConnection) urls.openConnection();
            //設(shè)置打開連接的方法
            httpURLConnection.setRequestMethod("GET");
            //開始連接
            httpURLConnection.connect();
            InputStream in = httpURLConnection.getInputStream();
            InputStreamReader isr = new InputStreamReader(in);
            BufferedReader br = new BufferedReader(isr);
            String temp = null;
            while((temp = br.readLine())!=null){
                sb.append(temp);
            }
            br.close();
            isr.close();
            in.close();
        } catch(IOException e){
            e.printStackTrace();
        } finally{
            if(httpURLConnection!=null){
                httpURLConnection.disconnect();
            }
        }
        return sb.toString();
    }

至此,準(zhǔn)備工作做完,接下來是跨域SSO實(shí)現(xiàn)中最重要的部分,也就是cookie的設(shè)置,在之前完全同域和同父域的情況下,為了實(shí)現(xiàn)SSO,我們在進(jìn)行doLogin時就設(shè)置了cookie,因?yàn)橛蛎嗤?,所以十分簡單,但是在跨域SSO中,因?yàn)椴煌蛑g的cookie是不可見的,所以我們不可能只設(shè)置一個cookie,然后令所有的域名下的應(yīng)用程序皆可見,所以我們應(yīng)該在每個域下面都有著為本域設(shè)置cookie的方法,而不應(yīng)該直接將設(shè)置cookie交給校驗(yàn)域。

//為本域設(shè)置cookie的方法
    public void addCookie(){
        Cookie cookie = new Cookie("ssocookie","sso");
        cookie.setPath("/");
        HttpServletResponse response = ServletActionContext.getResponse();
        response.addCookie(cookie);
    }

還需要在配置文件中進(jìn)行配置:

<action name="addCookie" class="www.a.com.Demo1Action" method="addCookie"></action>

寫完好方法,則需要進(jìn)行調(diào)用,因此我們需要找一個可以讓二者進(jìn)行交會的地方,在這里我選擇了登錄成功的瞬間,通過隱藏的Iframe讓二者進(jìn)行交會。

public String doLogin(){
        Map<String,String> map = new HashMap<String,String>();
        map.put("userName", userName);
        map.put("password", passWord);
        String result = Demo1Tool.doGet("http://www.x.com/sso/doLogin.action",map);
        if(result.equals("1")){
            return "success";
        }
        List hidderUrl = new ArrayList<String>();
        hidderUrl.add("http://www.a.com/demo1/addCookie.action");
        hidderUrl.add("http://www.b.com/demo2/addCookie.action");
        return "login";
    }
<c:forEach var="url" item="${hiddenUrl}">
    <iframe src="${url}" width="0px" heigth="0px" style="display:none"></iframe>
</c:forEach>

到此這篇關(guān)于java單點(diǎn)登錄(SSO)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java單點(diǎn)登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java并發(fā)編程之原子類

    詳解Java并發(fā)編程之原子類

    這篇文章主要為大家介紹了Java并發(fā)編程之原子類介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • java利用url實(shí)現(xiàn)網(wǎng)頁內(nèi)容的抓取

    java利用url實(shí)現(xiàn)網(wǎng)頁內(nèi)容的抓取

    本文主要介紹了java利用url實(shí)現(xiàn)網(wǎng)頁內(nèi)容抓取的示例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 使用Spring?Batch實(shí)現(xiàn)大數(shù)據(jù)處理的操作方法

    使用Spring?Batch實(shí)現(xiàn)大數(shù)據(jù)處理的操作方法

    通過使用Spring?Batch,我們可以高效地處理大規(guī)模數(shù)據(jù),本文介紹了如何配置和實(shí)現(xiàn)一個基本的Spring?Batch作業(yè),包括讀取數(shù)據(jù)、處理數(shù)據(jù)和寫入數(shù)據(jù)的全過程,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(42)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(42)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Spring Boot Debug調(diào)試過程圖解

    Spring Boot Debug調(diào)試過程圖解

    這篇文章主要介紹了Spring Boot Debug調(diào)試過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java實(shí)現(xiàn)的猴子吃桃問題算法示例

    Java實(shí)現(xiàn)的猴子吃桃問題算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的猴子吃桃問題算法,簡單描述了猴子吃桃問題并結(jié)合實(shí)例形式給出了java解決猴子吃桃問題的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-10-10
  • Java常用工具類匯總 附示例代碼

    Java常用工具類匯總 附示例代碼

    這篇文章主要介紹了Java常用工具類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著我來一起學(xué)習(xí)學(xué)習(xí)吧,希望能給你帶來幫助
    2021-06-06
  • Java正則驗(yàn)證IP的方法實(shí)例分析【測試可用】

    Java正則驗(yàn)證IP的方法實(shí)例分析【測試可用】

    這篇文章主要介紹了Java正則驗(yàn)證IP的方法,結(jié)合實(shí)例形式對比分析了網(wǎng)上常見的幾種針對IP的正則驗(yàn)證方法,最終給出了一個比較靠譜的IP正則驗(yàn)證表達(dá)式,需要的朋友可以參考下
    2017-08-08
  • java定時任務(wù)的實(shí)現(xiàn)方法

    java定時任務(wù)的實(shí)現(xiàn)方法

    java定時任務(wù)的實(shí)現(xiàn)方法,需要的朋友可以參考一下
    2013-03-03
  • 解決Mybatis中result標(biāo)簽識別不了的情況

    解決Mybatis中result標(biāo)簽識別不了的情況

    這篇文章主要介紹了解決Mybatis中result標(biāo)簽識別不了的情況,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01

最新評論

鄂伦春自治旗| 新干县| 法库县| 大关县| 闽清县| 建宁县| 乡宁县| 余干县| 札达县| 巴中市| 望江县| 新巴尔虎左旗| 三台县| 将乐县| 巴林右旗| 大化| 卢氏县| 吉安县| 霍州市| 邛崃市| 汾西县| 屏南县| 郸城县| 睢宁县| 岳阳市| 当阳市| 孟津县| 和顺县| 贡山| 清流县| 保康县| 霞浦县| 扬州市| 嵊州市| 舒兰市| 深水埗区| 叶城县| 水富县| 宜城市| 东平县| 克拉玛依市|