zoukankan      html  css  js  c++  java
  • 单点登录系统(一)

    1.SSO 概述

    单点登录(Single Sign On ), 是目前比较流行的企业业务整合解决方案之一. 在企业中存在多个业务系统, 用户只需要登录一次就可以访问这些彼此信任的业务系统.

    1.1 SSO体系结构

    单点登陆包括了四个组件:认证中心, 用户与帐号系统&用户数据获取接口, 客户端模块, 令牌

        1.1.1 认证中心 [所有业务系统都共享一个认证中心] (服务端)

        1.1.2 用户与帐号系统&用户数据获取接口 (服务端提供统一认证 用户数据 的接口)

        1.1.3 客户端模块

        1.1.4 令牌(token)

    image

    2. SSO认证流程

      认证流程: 当用户通过浏览器发起了业务资源的请求, 服务器会检测token[钥匙]是否存在; 如果token存在, 服务器继续校验token是否有效, 如果token有效, 用户就成功访问业务系统, 如果token无效, 浏览器Redirect到登录页面; token不存在,浏览器Redirect到SSO的用户与帐号系统模块, 提示用户输入用户名和密码来进行授权, 授权成功后, 服务器将生成的token传递给浏览器, 用户携带刚生成的token再次发起请求,完成业务资源的访问.

    image

    上面是关于SSO的大致流程图, 现在需要通过JAVA代码来具体实操.

    SSO相关核心技术:

    1. HTTP协议, cookie与session

    2. cookie与session的关系

    3. cookie SSO令牌的载体

    4. 决定cookie内容 生命周期 和有效范围的7个属性

        1. name和value 

        2. expires (过期时间)

        3. path和domain

        4.httponly 和secure

    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/path1/cookie-servlet")
    public class CookieServlet  extends HttpServlet{
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) {
            
            //读取cookie
            Cookie[] cookies = request.getCookies();
            if( cookies != null) {
                for (Cookie cookie : cookies) {
                    System.out.println(cookie.getName()+ ", " 
                            + cookie.getValue() + ", " 
                            + cookie.getMaxAge() + ", " 
                            + cookie.getPath() + ", "
                            + cookie.getDomain() + ", "
                            + cookie.getSecure() + ", "
                            + cookie.isHttpOnly());
                }
            }
            
            //写cookie
            Cookie cookie = new Cookie("cookie1", String.valueOf(System.currentTimeMillis()));  //      1. name和value 
            cookie.setMaxAge(12*60*60);  //2. expires (过期时间)
            cookie.setPath("/");  //cookie.setDomain("localhost")  //    3. path和domain
            //4.httponly 和 secure
            cookie.setHttpOnly(false);  //    JavaScript不能处理
            cookie.setSecure(false);    // 如果为true,仅支持HTTPS协议
            
            response.addCookie(cookie);
            
        }
        
    
    }

    Ctrl+shift+N 新建一个隐身窗口, 发起第一次get请求,  打开chrome开发工具, 查看network 下的 cookies ,发现浏览器有两个Map key 分别为 Request Cookies Response Cookies; 由于是第一次发起请求, 所以浏览器没有找到相应的cookie(token)[图1]. 在代码里, 也没有输出对应的浏览器发送过来的cookie; 

    此时刷新浏览器,  同样查看cookie[图2], 发现Request cookie 里携带了一个值和第一次get请求ResonseCookies的值是一样的.

    image

    图1

    image

    图2

    image

    5. JavaScript操作cookie的方法

    6. Java web应用中操作cookie的方法

    7. filter, WEB层的拦截器

  • 相关阅读:
    MFC中添加ToolTip提示框
    神经网络算法程序
    DOS命令大全(经典收藏)
    axure团队合作开发原型图
    POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
    了解你的家公家IP
    HDOJ 3518 Boring counting
    模板方法模式的房间改造-组合查询
    6最好的之一 HTML5/CSS3 演示(PPT)框架
    试想一下,在代码学习Swift!
  • 原文地址:https://www.cnblogs.com/yjm9898/p/5196810.html
Copyright © 2011-2022 走看看