zoukankan      html  css  js  c++  java
  • 单点登录和单点注销

    1.在分布式系统架构下是每一个系统都是由一个团队进行维护,每个系统都是单独部署运行一个单独的应用容器如Tomcat,所以,不能将用户的登录信息保存到session中。

    多个tomcat的session一般是不能共享的,虽然我们可以利用tomcat自身的session同步功能,但随着机器和业务量增加,效率会越来越低。而且这样做会使业务和Tomcat严重耦
    合,不利于扩展,所以我们需要一个单独的系统来维护用户的登录信息,这个系统就是SSO即单点登录系统。

    单点登录是一个热门话题,是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。

    2.单点登录系统由于其特殊性,不能使用容器的session,只能由用户自己基于session的性质重新开发一套有状态的会话保持系统。
    3.解释

    传统的session是将用户信息存入内存,维护一个哈希表。每一次请求携带JSESSIONID到服务端,根据此JSESSIONID查找到对应的用户信息。
    由此出发我们想到可以利用Redis等内存数据库进行用户信息的存储,自定义Token生成规则将用户信息写入Redis中。这样将用户信息的存储和业务系统进行拆分,使系统更加健
    壮,更易于扩展。新加的系统只需要从SSO中获取相关的认证即可进行横向的业务扩展。而且Redis本身的性质也易于进行集群化的部署。

    5.StringUtils.isEmpty(userJsonData)是Apache commoms-lang包的工具类。
    6.URLDecoder.decode(cookie.getValue(), "UTF-8"),解码。URLEncoder是java.net包里的工具类
    7.注意,cookie并不是集合,而是就是一个键值对,只是一对。一个cookie也只能存储一对键值对信息。
    8.如果要存储多个键值对,就要用多个cookie来存储。
    request.getCoookies()能获得cookie数组,
    如:/**
    47 * 取得cookie的值
    48 * @param request
    49 * @param key cookie主键
    50 */
    51 public static String getCookieValue(HttpServletRequest request, String key) throws UnsupportedEncodingException{
    52 for(Cookie cookie : request.getCookies()){
    53 if (cookie.getName().equals(key)) {
    54 return URLDecoder.decode(cookie.getValue(), "UTF-8");
    55 }
    56 }
    57 return null;
    58 }
    59 }
    6.cookie和session全是hashmap,里面全是键值对。可以添加、删除、获取cookie/session里的key和value。
    /**
    14 * 添加cookie
    15 * @param response
    16 * @param key cookie主键
    17 * @param value cookie值
    18 */
    19 public static void addCookie(HttpServletResponse response, String key, String value){
    20 Cookie cookie = new Cookie(key, value);
    21 cookie.setPath("/");// 这个要设置
    22 cookie.setMaxAge(60*60*24*30);//保留一个月 以秒为单位
    23 response.addCookie(cookie);

    /**
    27 * 删除cookie
    28 * @param request
    29 * @param response
    30 * @param key cookie主键
    31 */
    32 public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String key){
    33 Cookie cookies[] = request.getCookies();
    34 if (cookies != null) {
    35 for (int i = 0; i < cookies.length; i++) {
    36 if (cookies[i].getName().equals(key)) {
    37 Cookie cookie = new Cookie(key,null);
    38 cookie.setPath("/");//设置成跟写入cookies一样的
    39 cookie.setMaxAge(0);
    40 response.addCookie(cookie);
    41 }
    42 }
    43 }
    44 }
    45


    20.name=new String(name.getBytes("iso8859-1"),"UTF-8");

  • 相关阅读:
    SD卡 家族的发展
    onenand小结 及 与nor 和nand 的区别
    PHP程序开发范例学习之表单――获取文本框的值
    Smarty 模板初体验
    symfony object route class: sfDoctrineRoute
    数据结构&算法(PHP描述) 简单选择排序 simple selection sort
    FLEAPHP操作两个数据库
    让Nginx支持ThinkPHP的URL重写和PATHINFO
    Apache中限制和允许特定IP访问(转载)
    php记录日志
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6439831.html
Copyright © 2011-2022 走看看