• 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 2

    RedisHttpSession 的设计与实现

    Posted by 撒得一地 on 2016年5月16日 in 杂谈
    国外稳定加速器推荐    Express | Vypr

    前言

    RedisHttpSession 是我的一个 Java 开源项目,通过将 Session 存储在 Redis 中实现多服务器间共享 Session,同时这一过程是完全透明的。主要用于支持 RESTfuls API。下面我将对其核心类进行分析,阐述它的设计以及实现细节。

    RedisHttpSession

    这个类实现了HttpSession接口,用于替换默认的HttpSession实现。RedisHttpSessionHttpSession的接口方法重写了一遍,将HttpSession的属性存储到了 Redis 中。

    每个RedisHttpSession都有一个 UUID 与之对应,该字段加上session:前缀作为存储在 Redis 中的键值。例如:

    localhost:63679> keys *
    1) "session:fd9ec3cf-fb9b-4672-ade6-67a810e7db9f"
    2) "session:cbaa057c-85a4-475d-b399-38c320e85dcc"
    3) "session:13e030f5-de3d-458f-8d25-fd5643c40ff0"
    4) "session:262596b3-3d13-4df1-8328-714153c1ae83"
    5) "session:0b7d04c6-eaac-4eed-a9aa-8366f25f04f0"
    

    同时,RedisHttpSession中的属性是直接序列化成字节数组存储在 Redis 中的,存储在对应键中的哈希表里面。例如:

    localhost:63679> hgetall session:fd9ec3cf-fb9b-4672-ade6-67a810e7db9f
    1) "lastAccessedTime"
    2) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01T\x91\x03\"\xec"
    3) "maxInactiveInterval"
    4) "\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\a\b"
    5) "creationTime"
    6) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01T\x91\x03\"\xb4"
    

    另外,Session 的自动过期是通过 Redis 设置键的过期时间实现的。

    RedisHttpSessionProxy

    RedisHttpSessionProxyRedisHttpSession的代理类,使用了 JDK 的动态代理。为什么要引入代理?这是基于下面的考虑做出的设计。

    1. 由于 Session 存储在 Redis 中,在执行每个RedisHttpSession的接口方法之前都需要检查 Redis 连接是否可用。
    2. 访问一个已经被注销的 Session 需要抛出异常。
    3. 每次访问 Session 需要刷新过期时间和最后访问时间。

    基于上面的考虑,对于每个RedisHttpSession的接口方法,我们都需要进行重复的操作,因此使用动态代理对每个接口方法进行增强是最合适的。代码如下:

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        RedisHttpSession session = (RedisHttpSession) originalObj;
        //check redis connection
        RedisConnection connection = session.getRedisConnection();
        if (!connection.isConnected()){
            connection.close();
            session.setRedisConnection(repository.getRedisConnection());
        }
        //For every methods of interface, check it valid or not
        if (session.isInvalidated()){
            throw new IllegalStateException("The HttpSession has already be invalidated.");
        } else {
            Object result =  method.invoke(originalObj, args);
            //if not invalidate method, refresh expireTime and lastAccessedTime;
            if (!method.getName().equals("invalidate")) {
                session.refresh();
                session.setLastAccessedTime(System.currentTimeMillis());
            }
            return result;
        }
    }
    

    RedisHttpSessionFilter

    RedisHttpSessionFilter作为过滤器,将请求和响应替换成RedisSessionRequestWrapperRedisSessionResponseWrapper,利用了装饰器模式动态的给请求和响应进行增强:

    1. RedisSessionRequestWrapper:重写了getSession,替换默认的HttpSession实现为RedisHttpSession。
    2. RedisSessionResponseWrapper:在响应的头部中加入x-auth-token字段,作为 Session 的 ID??突Ф酥蟮那肭蠖夹枰酱米侄?,以便服务端识别对应的 Session。

    总结

    RedisHttpSession 利用 Filter 将请求的 Session 替换成 RedisHttpSession,在过滤阶段偷梁换柱,在之后对 Session 的操作都无需关心其内部实现,整个过程都是透明的。

    原文://blog.xiaohansong.com/2016/05/15/RedisHttpSession/

    上一篇:

    下一篇:

    相关推荐

    2 Comments

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    2 + 0 = ?

    网站地图|广东快乐10分开奖直播

    Copyright © 2015-2019 广东快乐10分开奖直播 All rights reserved.
    闽ICP备15015576号-1,版权所有?psz.

  • 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 浙江飞鱼控股有限公司 pk10技巧345678定位 求新时时彩高手一起玩 北京pk10计划软件安卓 排列五和值走势图 七星彩最新开奖结果 体彩p5走势图带连线专业版 厦门福利彩票中心电话 山东体育彩票 北京pk10怎么研究走势 任选9场胜负彩玩法 上海时时彩最快开奖结果 香港赛马协会 新新疆时时彩开奖号码 幸运农场有几期 七乐彩投注一休彩票1xcp