码迷,mamicode.com
首页 > 编程语言 > 详细

Java单点登录学习心得

时间:2019-01-28 16:07:50      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:流程   cookie   验证   其他应用   提示信息   main   访问   代码下载   基本   

什么是单点登录?

  SSO(Single Sign On)单点登录是实现多个系统之间统一登录的验证系统,简单来说就是:有A,B,C三个系统,在A处登录过后,再访问B系统,B系统就已经处于了登录状态,C系统也是一样。举个生活中栗子:你同时打开天猫和淘宝,都进入login界面,都要求你登录的,现在你在淘宝处登录后,直接在天猫处刷新,你会发现,你已经登录了,而且就是你在淘宝上登录的用户。说明他们实现了SSO,并且持有相同的信息。

整体流程

技术分享图片

编码实现(结尾贴代码)

1.工程创建

  • 创建一个JAVA模块,在这个模块下创建3个web应用,其中一个当作单点登录服务器sso_server,另外2个分别当作2个应用app1和app2
  • 创建基本目录和包结构,并导入依赖的jar包
  • 配置不同端口的tomcat服务器

2.实现思路

  1. 第一次访问App1或App2登录受限的页面时,使用过滤器将其全部重定向到单点登录服务器的登录页面,并带上本应用域名标识来源(以下假设请求来源app1,默认登录成功是/index)
  2. 单点登录服务器重写LoginServlet中init和service方法,在init方法中获取在xml中配置的需要实现单点登录服务器的域名信息,用逗号分割
  3. service方法用来处理请求
    1. 当请求是/ssoLogin,也就是app1重定向过来的,将请求转发到/login.jsp,显示登录页面
    2. 当请求是/login,也就是用户提交表单,模拟登录,登录失败,转发到/login.jsp,转发前往request作用域添加请求来源信息,然后添加到登录表单隐藏域中用于下次判断,
    3. 登录成功,直接重定向到对应来源的应用登录成功页面--带上登录标识UUID生成或者其他方式以及其他应用地址(需要进行字符串替换,过滤掉自己)
  4. 然后请求回到了app1下的/index,经过过滤器的验证(后面这里会修改)交给app1的MainServlet处理,重写service方法,用来处理请求
    1. 当请求是/index,说明是单点登录过来的,同时带上了登录标识flag和其他应用域名信息domains(逗号分割的字符串),这里将其拆分,用一个线程池去并发通知其他应用执行设置Cookies操作,带上操作标识和登录标识,通知完回到本应用默认首页
    2. 这里封装了一个方法syncCookies(server, flag, "setCookie");
    3. 别的应用也需要调用setCookies方法,所以要配置相关访问路径做相应处理
  5. 这个时候有Cookies了,需要考虑Cookies存在的情况登录判断,修改app1中的过滤器
    1. 从Cookies中获取登录标识,判断是否超时
    2. 重新获取登录标识,没有重定向到sso服务器的登录
    3. 有则重新设置cookies,‘:‘带上过期时间用于下次判断
    4. cookies中不存在登录标识.请求参数也没有,重定向到sso服务器的登录页
    5. cookies中不存在登录标识.请求参数中有,重新设置cookies带上过期时间
  6. 退出实现
    1. 当请求是/ssoLogout,,使用过滤器将其全部重定向到单点登录服务器的退出,并带上本应用域名标识来源(应该在带上用户标识表明是那个用户,这里简化不作处理)
    2. 单点登录服务器service方法处理退出请求,重定向到来源应用的退出,并带上其他应用域名信息用于通知
    3. 然后回到了app1下的MainServlet中service方法处理请求
    4. 退出删除cookies中的登录标识(这里设置一个新的cookies为空,有效期为0,覆盖掉原来的cookies),然后调用一个线程池去并发通知其他应用执行移除Cookies操作,带上操作标识和登录标识,通知完回到本应用退出登录页,
    5. syncCookies(server, "", "removeCookie");
    6. 别的应用也需要调用removeCookie方法,所以要配置相关访问路径做相应处理

 

总结

  • 单点登录服务器需要实现的操作
    • 配置需要单点登录的应用域名信息
    • 登录页/ssoLogin
    • 登录提交/login
      • 成功重定向到对应来源的应用登录成功页面--带上登录标识以及其他应用地址
      • 失败 往request作用域添加请求来源信息添加到隐藏域中用于下次判断,转发到登录页
    • 退出登录/ssoLogout
      • 重定向到来源应用的退出,并带上其他应用域名信息用于通知
  • 各应用服务器需要实现的操作(app1和app2代码基本一样只是配置本应用域名不同)
    •   过滤器Filter
      • 配置sso_server地址和本应用地址,过滤全部请求
      • 退出请求,则重定向到sso_server服务器的退出
      • 判断cookies有没有登录标识,是否过期,
        • cookies有但过期了,
          • 请求参数中无登录标识,重定向到sso_server服务器的登录页
          • 请求参数中有登录标识,则重新设置cookies和过期时间
        • cookies没有
          • 请求参数中无登录标识,重定向到sso_server服务器的登录页
          • 请求参数中有登录标识,则重新设置cookies和过期时间
  • Servlet
    • 重写service方法处理请求
    • sso_server认证成功回到/index请求(app1默认首页),如果是第一次登录,会从请求参数中获取登录标识和需要通知的其他应用地址,将地址拆分,并发通知其他应用设置cookies信息
    • 可能是你通知我,也可能是我通知你,所以本应用也要实现setCookies操作
    • 如果是退出请求/logout,同理也需要通知其他应用删除cookies
    • 本应用也要实现removeCookies操作

遇到的问题

1.IDEA调试无法启动报错Unable to open debugger port (127.0.0.1:51554): java.net.SocketException "socket closed"

  暴力解决方法:干掉所有的java进程,重新启动即可,任务管理器结束掉所有的 java.exe进程

2. 线程池的创建方式,在使用阿里巴巴代码规范插件检查时,发现并不推荐使用

 private ExecutorService service = Executors.newFixedThreadPool(10);
//提示信息:不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险

  解决方案:http://www.cnblogs.com/javanoob/p/threadpool.html

 

代码下载地址:sso.rar

Java单点登录学习心得

标签:流程   cookie   验证   其他应用   提示信息   main   访问   代码下载   基本   

原文地址:https://www.cnblogs.com/phperpxy/p/10330409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!