zoukankan      html  css  js  c++  java
  • 项目中琐碎知识(三)

    (一)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,表示没有登录.则根据具体的业务实现再定.

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

  • 相关阅读:
    H5调用本地摄像头
    zepto和jquery的区别,zepto的不同使用8条小结
    web前端页面性能优化小结
    超赞!聊聊WEB APP、HYBRID APP与NATIVE APP的设计差异
    activemq生产者和消费者的双向通信
    消息队列同步和异步机制
    postman使用教程
    spring boot mybatis sql打印到控制台
    spring boot 整合 mybatis 以及原理
    spring 框架整合mybatis的源码分析
  • 原文地址:https://www.cnblogs.com/misscai/p/9959728.html
Copyright © 2011-2022 走看看