• 项目中琐碎知识(三)


    (一)ThreadLocal

        动态的获取信息

      1 需求分析

        如果将用户信息保存到?Session域中,那么需要在Controller方法中必须添加request对象.

      但是想在任何地方获取用户信息应该怎么办??

      解决方案:   ThreadLocal

      2 功能原理

        ThreadLocal(本地线程变量)在一个线程内,实现数据的共享,线程是安全的.

        但是使用它的时候一定要记得释放资源,因为GC回收不了它.如果不释放的话,会造成内存泄漏.

        

      

      3 工具类代码

    public class UserThreadLocal {
        
        private static ThreadLocal<User> userThread = new ThreadLocal<>();
        
        public static void set(User user){
            
            userThread.set(user);
        }
        
        public static User get(){
            
            return userThread.get();
        }
        
        //防止内存泄漏
        public static void remove(){
            
            userThread.remove();
        }
        
    }

    (二)实现单点登录流程

      1 需求分析

       根据分布式的思想,需要将服务进行拆分.拆分完成后为了抗击高并发,搭建tomcat服务器集群.但是现在遇到的问题是,用户访问系统时需要频繁地登录.

       

       2 解决方案

      

      问题:如果用户没有登录,则不允许执行敏感操作(查询订单/查询物流)

      因为采用集群的搭建方式,所以session不能共享.

      解决:(以上图为例)

    1. 当用户输入用户名和密码后点击登录按钮后,系统访问jt-web
    2. jt-web接收用户的数据后经过加密处理后,请求JT-SSO进行数据校验
    3. JT-SSO接收请求后,进行用户信息的校验.如果根据数据查询,用户不存在,用户输入的用户名或者密码错误,则直接返回错误提示(state:201). 如果用户名和密码正确,则开始实现单点登录.
    4. 生成加密的秘钥TOKEN,之后将user数据转化为userJSON数据,将数据保存到redis中.token充当key,userJSON充当value.
    5. JT-SSO将用户登录的秘钥token返回给JT-WEB
    6. JT-WEB将token数据返回给用户,将token数据保存到用户浏览器的cookie中
    7. 如果用户再次访问JT-WEB时,获取cookie中的TOKEN,查询Redis缓存服务器.如果有数据,则证明用户已经登录.则进行数据回显.如果用户返回数据为null,表示没有登录.则根据具体的业务实现再定.

              功成名就不是目的,让自己快乐,这才是生活的意义.

  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/misscai/p/9959728.html
Copyright © 2020-2023  润新知