zoukankan      html  css  js  c++  java
  • 模块3之实现分布式session

    简介

      session,token,cookie,这几个词真是搞得我头大,他们到底有什么联系和区别呢?今天就来翻译翻译什么是session,什么他妈的是session,什么他妈的是他妈的session?

    分布式session:当用户访问网站时,服务器会存储一些用户的重要信息,当用户下次发出请求时读取这些重要的信息;但是,网站通常配备多台服务器,可能用户的所用请求不会

    全落到同一台服务器上,所以需要实现,一台服务器保存的用户的重要信息可以被每台服务器获取。

    说明:本博文代码来自Java秒杀项目

    准备:

    redis服务器,会将用户重要信息存储在redis服务器;被存储的用户重要信息:MySQL中存储的用户对应的记录,实际开发时不会是这些内容。

    用户登录时将重要信息缓存到redis中

    1 String token = UUIDUtil.UUID();
    2 addCookie(httpResponse,token,miaoshaUser);
     1 /*
     2     *将token放入redis和response中
     3      */
     4     private void addCookie(HttpServletResponse httpResponse,String token,MiaoshaUser miaoshaUser){
     5         redisService.set(MiaoshaUserPrefix.getBytoken,token,miaoshaUser);
     6                                                                                                                         //将token值返回给浏览器端
     7         Cookie cookie = new Cookie(TOKEN_NAME,token);
     8         cookie.setMaxAge(MiaoshaUserPrefix.getBytoken.expireSeconds);                             //M.g.expireSeconds=3600*24*2 (两天)
     9         cookie.setPath("/");
    10         httpResponse.addCookie(cookie);
    11     }

    token本质为一个随机字符串,它在此处的功能为一个标识符,一个token对应一条redis缓存;因为在redis缓存中将token设为了key,而value为重要信息。

    我们将token放到cookie中,并设置过期时间为2天,访问本项目根目录下所有路径都会携带,将cookie放到httpResponse返回给浏览器。

    获取用户的重要信息

    使用下面的方法来获取存储在redis中的用户的重要信息。只需要用户的request中得到token值,任何的服务器都可以获得用户的重要信息。

     1 /**
     2      * 通过request提供的cookie获得MiaoShaUser对象
     3      */
     4     private MiaoshaUser getMiaoshaUser(HttpServletRequest request, HttpServletResponse response){
     5         String paramToken = request.getParameter(MiaoshaUserService.TOKEN_NAME);
     6         String cookieToken = getCookieValue(request,MiaoshaUserService.TOKEN_NAME);
     7         //使用cookie得到对象
     8         if (StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)) {
     9             return null;
    10         }
    11         String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;   //优先取paraToken
    12         MiaoshaUser user = miaoshaUserService.getByToken(token,response);
    13         return user;
    14     }
     1 /*
     2      *   获得request中的cookie值
     3     */
     4     private String getCookieValue(HttpServletRequest request, String tokenName) {
     5         Cookie[] cookies = request.getCookies();
     6         if(cookies==null || cookies.length<=0){
     7             return null;
     8         }
     9         for (Cookie c:cookies
    10         ) {
    11             if (c.getName().equals(tokenName)) {
    12                 return c.getValue();
    13             }
    14         }
    15         return null;
    16     }

    手机用户可能会将token作为一个Parameter放到HttpServletRequest中,所以要在两个地方去获取token值。

    一个使用request.getParameter()方法来获取token;另一种,获取request中所有的cookie,然后遍历cookie,即方法getCookieValue。

    总结

    通过上面的设计,任何服务器收到用户的请求后都能从redis中获取用户的重要信息。

  • 相关阅读:
    mysql-基础和基本指令
    网络笔试面试
    Windows访问Linux下的共享目录的配置方法
    帧动画 连续播放多张图片动画 以及ui动画 SoundPool
    ScrollView listView gridView 之间的冲突问题
    handler------post传送方式
    handler通信机制
    内部存储 openFileInputStream openFileOutputStream
    popupMenu-----弹出菜单
    为系统菜单添加图标--------暴力反射
  • 原文地址:https://www.cnblogs.com/deijiawoyu/p/12715940.html
Copyright © 2011-2022 走看看