1.什麼是單點登陸(SSO)?簡而言之,就是一個公司旗下的多個相互信任的項目,只須要登陸其中的一個,其餘的都默認登陸。好比,你在網頁上登陸新浪微博,再打開新浪博客,你會發現,你已經登陸新浪博客了,這就是單點登陸的魅力。跨域
2.如何實現單點登陸?你要訪問一個網站,他會檢查你的身份合格不合格,若是不合格,就讓你去登陸,若是合格,就放行。那麼你登陸的身份信息保存在哪裏呢?就在一個叫作cookie的容器裏,因此說,單點登陸,就是和cookie做鬥爭,並且須要一個統一的登陸接口。因此掌握cookie、寫好了統一登陸接口就等於掌握了單點登陸!服務器
3.單點登陸分爲同域單點登陸、同父域、跨域。那麼什麼叫域?舉個例子:https://a.x.com,其中com就是一級域,x就是二級域。同域就是後綴名如出一轍的在同一個應用裏面的。例如https://a.x.com/insert 和https://a.x.com/update 就是同域操做。什麼叫同父域?https://a.x.com和https://b.x.com就是同父域,父就是x。跨域是什麼你們就明白了吧!cookie
4.同域如何實現單點登陸?就是你登陸以後就要獲取到一張票,接下來你再去訪問相關的網站,這張票就能夠用!請看代碼:app
@RequestMapping("/addCookie") public String addCookie(HttpServletResponse response){ Cookie cookie=new Cookie("sso","sso"); response.addCookie(cookie); return null; }
5.同父域如何實現?與同域不一樣的是,在寫入身份信息(cookie)的時候,注意要將cookie的位置定義爲父級(x域),此時任何子域都能共享同一個父域的cookie,請看代碼:網站
@RequestMapping("/addCookie") public String addCookie(HttpServletResponse response){ Cookie cookie=new Cookie("sso","sso"); cookie.setDomain(".x.com"); cookie.setPath("/"); response.addCookie(cookie); return null; }
其中的重點是,要把cookie的域設置爲父域(注意不能少一個點),其次要把cookie路徑設置爲根路徑url
6.跨域實現單點登陸,跨域如何實現單點登陸?撓破腦殼也想不到。由於你cookie怎麼都不能寫在不一樣的域。那應該怎麼辦呢?我想到了相互信任。跨域就好像,你在我這邊登陸了,我錄入了你的身份信息。我沒辦法在個人朋友那裏按着他的腦殼讓他也給你記錄身份信息,給你經過,可是我和我朋友互相信任,我只要告訴他,嘿,兄弟,這個小哥在我這裏已經登陸了,你那邊也別攔着他了。OK了。那這個就涉及到服務器間的通訊。請看代碼(代碼與單點登陸無關,單純的服務器之間的通訊):spa
public class Demo1Tool { public static String check(String urll, Map<String,String> map) { HttpURLConnection httpURLConnection=null; try { URL url=new URL(urll); httpURLConnection=(HttpURLConnection)url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.connect(); InputStream inputStream=httpURLConnection.getInputStream(); InputStreamReader inputStreamReader=new InputStreamReader(inputStream); BufferedReader bufferedReader=new BufferedReader(inputStreamReader); String temp=null; while ((temp=bufferedReader.readLine())!=null){ stringBuffer.append(temp); } bufferedReader.close(); inputStreamReader.close(); inputStream.close(); }catch (IOException io){ System.out.println(io); }finally { if(httpURLConnection!=null){ httpURLConnection.disconnect(); } } return stringBuffer.toString(); }