资讯专栏INFORMATION COLUMN

无状态会话

waltr / 2166人阅读

摘要:一当用户访问一个系统的时候,是不存在会话这种东西的,访问一次就断开和系统之间的连接,这种情况下一般来说需要在后台做控制来维系用户和系统之间的关系。

一、What?
当用户访问一个系统的时候,是"不存在"会话这种东西的,访问一次就断开和系统之间的连接,这种情况下一般来说需要在后台做控制来维系用户和系统之间的关系。既然Tomcat服务器做不到,那么可以考虑用redis来实现。
二、Why? Redis-session的好处

便于拓展,当单体应用扩展成集群会相当方便

便于权限认证

三、How? 1、当用户注册或登录时,保存唯一Token到redis中
String uniqueToken = UUID.randomUUID().toString();
redis.set(USER_REDIS_SESSION+":"+userModel.getId(), uniqueToken, 1000 * 60 * 30);
2、当用户需要做某些操作时(比如上传文件,修改个人信息等),可以通过拦截器来对用户做验证
@Autowired
    public RedisOperator redis;
    public static final String USER_REDIS_SESSION = "user-redis-session";
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userId = request.getHeader("userId");
        String userToken = request.getHeader("userToken");
        if(StringUtils.isNoneBlank(userId) && StringUtils.isNoneBlank(userToken)){
            String uniqueToken = redis.get(USER_REDIS_SESSION + ":" + userId);
            if(StringUtils.isEmpty(uniqueToken) && StringUtils.isBlank(uniqueToken)){
                //userToken在redis中已过时,需重新登录
                System.out.println("请登录。。");
                returnErrorResponse(response,IMoocJSONResult.errorTokenMsg("请登录。。"));
                return false;
            }else{
               if(!uniqueToken.equals(userToken)){
                   //userToken被修改了,说明有其他人登录,这里可以控制只能一个人登录
                   System.out.println("账号被挤出...");
                   returnErrorResponse(response,IMoocJSONResult.errorTokenMsg("账号被挤出..."));
                   return false;
               }
            }
        }else{
            //消息头没有userId和userToken说明用户还未登录
            System.out.println("请登录。。");
            returnErrorResponse(response,IMoocJSONResult.errorTokenMsg("请登录。。"));
            return false;
        }
        return true;
    }
    
    ..........
    ..........
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**")
                                                  .addPathPatterns("/bgm/**")
                                                  .addPathPatterns("/video/userLike","/video/userUnLike","/video/saveComment")
                                                  .addPathPatterns("/video/upload","/video/uploadCover")
                                                  .excludePathPatterns("/user/queryPublisher");
        WebMvcConfigurer.super.addInterceptors(registry);
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74089.html

相关文章

  • 第六天-《企业应用架构模式》-会话状态

    摘要:无状态的价值无状态可以仅用很少的对象就可以处理很多的用户,空闲状态的用户越多,无状态服务器就越有用会话状态相关性会话状态只与当前会话有关,它存在于业务事务中,与其他会话及他们的业务事务是分开的与记录数据信息的区别记录数据时长期保存在数据库中 1. 无状态的价值: 无状态可以仅用很少的对象就可以处理很多的用户,空闲状态的用户越多,无状态服务器就越有用 2. 会话状态: 相关性:会话状态只...

    FrancisSoung 评论0 收藏0
  • 小哥哥,小姐姐,我有一份tcp、http面试指南你要吗?

    摘要:会通过建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,会立即将连接断开,这个过程是很短的。这三个部分以作为分隔符。最后一个消息头有两个,用来表示消息头部的结束。但是这并不代表建立在协议之上的应用程序就无法维持状态。 来来来 对,我就是骗你进来的。嘿嘿嘿... 既然来了就看看再走嘛 作为一个学通信出身的前端,说道http、tcp什么的,算是到了我的领域了。(我会告诉你我上课净睡...

    GitCafe 评论0 收藏0
  • cookie

    摘要:背景是一种无状态的协议,它不对请求和响应之间的通信状态进行保存,即无法根据之前的状态进行本次请求的处理。为了保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了。主要目的是为防止跨站脚本攻击对的信息窃取。 需求场景 一个Vue单页应用,A、B、C 三个页面都引用了一个公用的时间选择器。用户在各自页面选择完时间后,A,B,C页面互相切换时保存选择的时间,在关闭浏览器tab后,清...

    bawn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<