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