1、使用Cookie解决单点登录

技术点:

1、设置Cookie的路径为setPath("/").即Tomcat的目录下都有效

2、设置Cookie的域setDomain(".itcast.com");即bbs.itcast.com,或是mail.itcast.com有效。即跨域。

3、设置Cookie的时间。即使用户不选择在几天内自动登录,也应该保存Cookie以保存在当前浏览器没有关闭的情况下有效。

4、使用Filter自动登录。

实现步骤

1:首先要准备出几个虚拟主机并配置hosts文件,即本机DNS修改本机的C:\Windows\System32\drivers\etc下的hosts文件。

  1. <span style="font-size:18px;"><span style="font-size:18px;"># localhost name resolution is handled within DNS itself.
  2. #   127.0.0.1        localhost
  3. #   ::1             localhost
  4. 127.0.0.1       localhost
  5. 127.0.0.1       www.bbs.itcast.cn
  6. 127.0.0.1       www.news.itcast.cn
  7. 127.0.0.1       www.news.com
  8. 127.0.0.1       www.bbs.com
  9. 127.0.0.1       www.server.com
  10. </span></span>

增加几个Host节点,通过Cookie实现自动登录,必须配置的虚拟主页满足xxx.itcast.cn,即主域名必须保持一致。

一般web应用中一般部署在web.xml文件中,单点退出相关配置如下:

  1. <span style="font-size:18px;"><span style="font-size:18px;"><filter>
  2. <filter-name>CAS Authentication Filter</filter-name>
  3. <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
  4. <init-param>
  5. <!--到哪去登录-->
  6. <param-name>casServerLoginUrl</param-name>
  7. <param-value>http://www.server.com:8080/login</param-value>
  8. </init-param>
  9. <init-param>
  10. <!--我是谁-->
  11. <param-name>serverName</param-name>
  12. <param-value>http://www.bbs.com:8080</param-value>
  13. </init-param>
  14. <init-param>
  15. <param-name>renew</param-name>
  16. <param-value>false</param-value>
  17. </init-param>
  18. <init-param>
  19. <param-name>gateway</param-name>
  20. <param-value>false</param-value>
  21. </init-param>
  22. </filter>
  23. <filter>
  24. <filter-name>CAS Validation Filter</filter-name>
  25. <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
  26. <init-param>
  27. <param-name>casServerUrlPrefix</param-name>
  28. <param-value>http://www.server.com:8080</param-value>
  29. </init-param>
  30. <init-param>
  31. <param-name>serverName</param-name>
  32. <param-value>http://www.bbs.com:8080</param-value>
  33. </init-param>
  34. <!--
  35. <init-param>
  36. <param-name>proxyCallbackUrl</param-name>
  37. <param-value>https://localhost:8443/mywebapp/proxyCallback</param-value>
  38. </init-param>
  39. <init-param>
  40. <param-name>proxyReceptorUrl</param-name>
  41. <param-value>/mywebapp/proxyCallback</param-value>
  42. </init-param>
  43. -->
  44. </filter>
  45. <filter>
  46. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  47. <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
  48. </filter>
  49. <filter>
  50. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  51. <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  52. </filter>
  53. <!-- ************************* -->
  54. <!-- Sign out not yet implemented -->
  55. <!--
  56. <filter-mapping>
  57. <filter-name>CAS Single Sign Out Filter</filter-name>
  58. <url-pattern>/*</url-pattern>
  59. </filter-mapping>
  60. -->
  61. <filter-mapping>
  62. <filter-name>CAS Authentication Filter</filter-name>
  63. <url-pattern>/protected/*</url-pattern>
  64. </filter-mapping>
  65. <filter-mapping>
  66. <filter-name>CAS Validation Filter</filter-name>
  67. <url-pattern>/*</url-pattern>
  68. </filter-mapping>
  69. <filter-mapping>
  70. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  71. <url-pattern>/*</url-pattern>
  72. </filter-mapping>
  73. <filter-mapping>
  74. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  75. <url-pattern>/*</url-pattern>
  76. </filter-mapping>
  77. <filter-mapping>
  78. <filter-name>CAS Validation Filter</filter-name>
  79. <url-pattern>/proxyCallback</url-pattern>
  80. </filter-mapping>
  81. <!--  *********************** -->
  82. <!-- Sign out not yet implemented -->
  83. <!--
  84. <listener>
  85. <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  86. </listener>
  87. -->
  88. <!--  *********************** -->
  89. <welcome-file-list>
  90. <welcome-file>index.jsp</welcome-file>
  91. </welcome-file-list></span></span>

说明:我们看到单点退出的相关类结构,web.xml配置了单点退出的相关类(1个监听器SingleSignOutHttpSessionListener,2个过滤器SingleSignOutFilter,SimpleServerLogoutHandler)。

实现利用了session存储机制,SessionStoreManager是个单例类,用于管理session的存储、删除;SessionMappingStorage是session的存储、删除的执行者,可以看到实际存储的结构是一个artifactId、sessionId为名值对的HashMap表;监听器SingleSignOutHttpSessionListener的作用是session销毁时,调用session管理单例类SessionStoreManager进行session的删除销毁;

SingleSignOutFilter的作用有2个:一个是在单点访问拦截安全资源时调用单例类SessionStoreManager存储session,另一个是在单点退出时调用单例类SessionStoreManager删除session;SimpleServerLogoutHandler的作用是将客户端的退出请求转发到SSO服务器端,集中处理做各个子系统的单点退出。

2、先在bbs(或是mail)虚拟目录下,开发一个可以自动登录的程序,使用Filter:

  1. <span style="font-size:18px;"><span style="font-size:18px;">1、登录的主页如下:
  2. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  4. <html>
  5. <head>
  6. </head>
  7. <body>
  8. <p>在同一台服务器上,多个站点自动登录....>>:<%=session.getId()%></p>
  9. <c:if test="${empty sessionScope.user}">
  10. <form name="f" method="post" action="<c:url value='/login'/>">
  11. Name:<input type="text" name="name"/><br/>
  12. Pwd:<input type="text" name="pwd"/><br/>
  13. <input type="checkbox" name="chk" value="7">一周内自动登录<br/>
  14. <input type="submit" value="登录"/>
  15. </form>
  16. </c:if>
  17. <c:if test="${not empty sessionScope.user}">
  18. 欢迎你:${user}。<a href="<c:url value='/loginout'/>">安全退出</a>
  19. </c:if>
  20. <br/>
  21. 相关站点:(只要在一边登录成功,即可以自动登录到另一个程序)<br/>
  22. <a href="http://mail.itcast.com:7777">mail.itcast.com</a><br/>
  23. <a href="http://bbs.itcast.com:7777">bbs.itcast.com</a><br/>
  24. </body>
  25. </html>
  26. </span></span>

2、登录的Servlet程序如下:

  1. <span style="font-size:18px;"><span style="font-size:18px;">/**
  2. * 用户登录
  3. */
  4. public class LoginServlet extends HttpServlet{
  5. public void doGet(HttpServletRequest req, HttpServletResponse resp)
  6. throws ServletException, IOException {
  7. doPost(req, resp);
  8. }
  9. public void doPost(HttpServletRequest req, HttpServletResponse resp)
  10. throws ServletException, IOException {
  11. String nm = req.getParameter("name");
  12. String pwd = req.getParameter("pwd");
  13. String chk = req.getParameter("chk");   //是否选中了7天自动登录
  14. String forward = "/index.jsp";
  15. if(nm!=null && !nm.trim().equals("") && nm.startsWith("it")//用户名是it开始,且密码是pwd开始的可以登录
  16. && pwd !=null && !pwd.trim().equals("") &&
  17. pwd.startsWith("pwd")){
  18. System.err.println("登录成功。。。。。");
  19. forward = "/jsps/welcome.jsp";
  20. //无论如何,都要设置cookie,如果没有选择自动登录,则只在当前页面的跳转时有效,否则设置有效期间为7天。
  21. Cookie cookie = new Cookie("autologin",nm+"@"+pwd);
  22. cookie.setPath("/");                //如果路径为/则为整个tomcat目录有用
  23. cookie.setDomain(".itcast.com");    //设置对所有*.itcast.com为后缀的域名效
  24. if(chk!=null){
  25. int time = 1*60*60*24*7;    //1秒*60=1分*60分=1小时*24=1天*7=7天
  26. cookie.setMaxAge(time);
  27. }
  28. resp.addCookie(cookie);
  29. req.getSession().setAttribute("user", nm);
  30. }else{
  31. System.err.println("登录不成功。。。。。。");
  32. }
  33. req.getRequestDispatcher(forward).forward(req, resp);
  34. }
  35. }
  36. </span></span>

3、自动登录的Filter程序如下:

  1. <span style="font-size:18px;"><span style="font-size:18px;">/**
  2. * 自动登录
  3. */
  4. public class AutoLogin implements Filter {
  5. public void destroy() {}
  6. public void doFilter(ServletRequest req, ServletResponse resp,
  7. FilterChain chain) throws IOException, ServletException {
  8. System.err.println("开始自动登录验证.....");//此类中应该对登录的servlet直接放行。根据判断url决定。
  9. HttpServletRequest requ = (HttpServletRequest) req;
  10. HttpSession s = requ.getSession();
  11. if (s.getAttribute("user") != null) {//如果用户已经登录则直接放行
  12. System.err.println("用户已经登录,没有必须要再做自动登录。。。。");
  13. } else {
  14. Cookie[] cookies = requ.getCookies();
  15. if (cookies != null) {
  16. for (Cookie ck : cookies) {
  17. if (ck.getName().equals("autologin")) {// 是否是自动登录。。。。
  18. System.err.println("自动登录成功。。。。。");
  19. String val = ck.getValue();
  20. String[] vals = val.split("@");
  21. s.setAttribute("user", vals[0]);
  22. }
  23. }
  24. }
  25. }
  26. chain.doFilter(req, resp);
  27. }
  28. public void init(FilterConfig filterConfig) throws ServletException {}
  29. }
  30. </span></span>

4、正常退出的Servlet如下

  1. <span style="font-size:18px;"><span style="font-size:18px;">/**
  2. * 安全退出删除Cookie
  3. */
  4. public class LoginOutServlet extends HttpServlet {
  5. public void doGet(HttpServletRequest req, HttpServletResponse resp)
  6. throws ServletException, IOException {
  7. HttpSession s = req.getSession();       //获取Session
  8. Cookie cookie = new Cookie("autologin","");//必须声明一个完全相同名称的Cookie
  9. cookie.setPath("/");//路径也要完全相同
  10. cookie.setDomain(".itcast.com");//域也要完全相同
  11. cookie.setMaxAge(0);//设置时间为0,以直接删除Cookie
  12. resp.addCookie(cookie);
  13. s.removeAttribute("user");
  14. System.err.println("安全退出。。。。。");
  15. resp.sendRedirect(req.getContextPath()+"/index.jsp");
  16. }
  17. }
  18. </span></span>

这种是基于最简单的方式实现的单点登录

SSO单点登录学习总结(2)——基于Cookie+fliter单点登录实例的更多相关文章

  1. 基于cookie的用户登录状态管理

    cookie是什么 先来花5分钟看完这篇文章:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies 看完上文,相信大家对cookie已经有 ...

  2. SSO 基于Cookie+fliter实现单点登录(SSO):工作原理

    SSO的概念: 单点登录SSO(Single Sign-On)是身份管理中的一部分. SSO的一种较为通俗的定义是:SSO是指訪问同一server不同应用中的受保护资源的同一用户,仅仅须要登录一次,即 ...

  3. SSO 基于Cookie+fliter实现单点登录 实例解析(一)

    接上文,SSO的理论讲解,接下来实践实践! 1.使用Cookie解决单点登录 技术点: 1.设置Cookie的路径为setPath("/").即Tomcat的目录下都有效 2.设置 ...

  4. Asp.Net Core基于Cookie实现同域单点登录(SSO)

    在同一个域名下有很多子系统 如:a.giant.com  b.giant.com   c.giant.com等 但是这些系统都是giant.com这个子域. 这样的情况就可以在不引用其它框架的情况下, ...

  5. SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例

    第一: 本demo在一个机器上实现(三个虚拟主机),来看SSO单点登录实例(我们可以布到多个机器上使用都是同一个道理的),一个服务器主机,和两个客户端虚拟主机 [html] view plaincop ...

  6. ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)

    前言 本系列前三篇文章分别从ASP.NET Core认证的三个重要概念,到如何实现最简单的登录.注销和认证,再到如何配置Cookie 选项,来介绍如何使用ASP.NET Core认证.感兴趣的可以了解 ...

  7. 基于cookie的SSO单点登录系统

    利用COOKIE实现单点登录功能 近期公司要求帮一个项目实现单点登录功能,在综合考量下决定采用cookie实现,大概的流程如下图所:

  8. 基于Cookie的SSO登录分析和实现

    什么是SSO? 现在很多大的互联网公司都会有很多的应用,比如以下是淘宝网的截图: 天猫 聚划算 头条等都是不同的应用,有的甚至采用完全不同的域名,但是所有在淘宝注册的用户都是使用的一套用户名和口令,如 ...

  9. SSO 基于CAS实现单点登录 实例解析(二)

    本文目录: 概述 演示环境 部署CAS-Server相关的Tomcat 部署CAS-Client相关的Tomcat 测试验证SSO 第一: 本demo在一个机器上实现(三个虚拟主机),来看SSO单点登 ...

随机推荐

  1. Connect the Campus (Uva 10397 Prim || Kruskal + 并查集)

    题意:给出n个点的坐标,要把n个点连通,使得总距离最小,可是有m对点已经连接,输入m,和m组a和b,表示a和b两点已经连接. 思路:两种做法.(1)用prim算法时,输入a,b.令mp[a][b]=0 ...

  2. poj--1637--Sightseeing tour(网络流,最大流判断混合图是否存在欧拉图)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Sub ...

  3. 基于SIFT的点云关键点提取

    这篇博文主要介绍SIFT算法在提取点云图像关键点时的具体用法. 尺度不变特征转换(Scale-invariant feature transform,SIFT)是David Lowe在1999年发表, ...

  4. Python正则表达式初识(七)

    继续分享Python正则表达式的基础知识,今天给大家分享的特殊字符是“\s”.“\S”,具体的教程如下. 1.“\s”代表的意思是匹配空格,匹配模式“加\s油”代表的是字符“加”和“油”之间有空格的意 ...

  5. qt获取磁盘序列号

    #include "windows.h" QString lpRootPathName = "c:\\"; LPTSTR lpVolumeNameBuffer= ...

  6. Android基础新手教程——1.2.1 使用Eclipse + ADT + SDK开发Android APP

    Android基础新手教程--1.2.1 使用Eclipse + ADT + SDK开发Android APP 标签(空格分隔): Android基础新手教程 1.前言 这里我们有两条路能够选,直接使 ...

  7. 关于Java的10个谎言

    以下的这些都算是比較高级的问题了.面试中一般也非常少问到.由于它们可能会把面试者拒之门外.只是你能够自己找个时间来实践一下. System.exit(0)会跳过finally块的运行 System.s ...

  8. StdTranslator - Translate PDMS to STD for STAAD.Pro

    StdTranslator - Translate PDMS to STD for STAAD.Pro eryar@163.com STAAD.Pro是由美国世界著名的工程咨询和CAD软件开发公司—R ...

  9. js---03属性操作

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. SpringBoot与Dubbo的整合-zookeeper和监控中心搭建

    对于Dubbo的应用已经是十分普遍,自从阿里巴巴开源以来,国内许多公司就采用了dubbo的架构来开发项目.不过再dubbo十分火的时候,突然就停止更新了, 只有当当网还在其基础进行了拓展(dubbox ...