前言

  此篇随笔记录了Remember-Me实现过程中出现的问题和解决方案,以及相关的思考。

正文

1. RememberMe是什么?

RememberMe意为记住我,对应登录界面的那个勾选项。另一种说法,就是自动登录。

2. 那什么又是自动登录呢?

我们知道Tomcat或者其他Servlet容器的会话都是有时限的,比如Tomcat的会话时间为30分钟,如果30分钟内没有访问,会话将被清除,这时候就不满足登录状态了。那你发出下一个请求,按照正常逻辑就会被拦截下来,告知你没有登录,然后跳转到登录界面让你重新登录。自动登录做的就是,当会话过期后,请求会根据Cookie信息实现透明登录。也就是重新又登录了一遍,产生了一个新的会话。但是在用户看来,他根本不知道发生了什么,而且重新登录的过程中不需要再让用户输入账号密码。

3. 为什么不把会话时间调大一点呢?

Tomcat的会话时间是可配置的。你可以设置成3天或者更久。但是这样就加大了服务器的开销。你设置3天,意味着一个HttpSession将会由Tomcat保留3天。(这里到底是保存在内存还是磁盘尚不确定,运行时内存的可能比较大),前面说了RemememberMe其实是自动登录,也就是说,它不会影响会话存在的时间。而且新会话的产生只能由新的请求触发。

如果用户登录后只浏览了10分钟,就挂着不动了,在都没有进行登出操作的情况下。对比一下两种方案的最大开销(服务端保留无用会话的时间)

第一种:3天会话时间  => 3天 - 10分钟 => 3*24*60 - 10 = 4310 分钟

第二种:30分钟会话时间(默认) => 30 - 10 分钟 = 20分钟

4. RememberMe的原理是什么?

本质上就是Cookie。在登录成功后,如果用户有勾选“记住我”,则服务端在响应中加上Remember-Me的cookie,让浏览器保存一段时间,如7天。在7天之内,如果用户会话过期,可凭此实现透明的重新登录。

5. Cookie中包含哪些内容呢?

1. 用户账号  => 不然无法知道谁要登录,而且需要依此获取密码,生成新签名进行比对

2. 过期时间 => 过期的时间节点,即如果浏览器没有及时自动清除此cookie,服务端收到后要据此删除。

3. 与密码有关的签名 => 如果没有密码的相关信息,那就很容易地通过伪造cookie,来登录其他人的账号。但是密码又不能是明文,必须经过加密。而且不能或者不能太容易被解开。

6. Spring Security中的Cookie格式

Base64(username:expireTime:MD5(username:expireTime:password:secretKey))

其中,签名signature由username、expireTime、password、secretKey组成的字符串,进过MD5加密而成。随后再整合username、expireTime利用Base64编码而成,Base64是可解码的。最终结果,基本上就是一条乱码了。

7. Cookie有了,服务端要怎么处理呢?

那就是Filter的事情了。需要定义一个Remember Me的Filter专门处理这个Cookie。值得一提的是,校验Cookie重新认证的过程还是要查数据库的,所以应该做到只有在必要的时候,即会话过期的时候,才执行校验操作。

8. Remember Me Filter与Login Filter的兼容

Login Filter所做的就是,让没有登录的用户,必须登录后才能处理请求。一般会直接返回错误码,让前端跳转到登录页,或者直接重定向到登录页。所以Remeber Me Filter肯定要放置在Login Filter之前。即会话过期后,先进行的应该是自动登录。

9. 登出后,Cookie的删除

用户执行登出操作后,肯定要删除浏览器的Cookie。否则,在Cookie过期之前,还是可以通过自动登录的方式,进入网站。但是,你不可能要求用户去操作浏览器,删除Cookie。这些操作应该由服务端完成。但是HTTP协议只有Set-Cookie的头,却没有类似Remove-Cookie这样的头。HttpServletResponse也没有明确的API可以删除客户端的Cookie。后来想到即可以通过添加不保存的同名Cookie来覆盖要删除的Cookie,后来参考了下Security的实现,发现它也是这么做的。代码如下:

public void logout(HttpServletRequest request, HttpServletResponse response) {//利用覆盖的方法删除客户端的remember-me cookieCookie cookie = new Cookie("remember-me", (String)null);cookie.setMaxAge(0);response.addCookie(cookie);request.getSession().invalidate();
}

转载于:https://www.cnblogs.com/longfurcat/p/10547834.html

【杂谈】Remember-Me的实现相关推荐

  1. 【杂谈】GAN最成功的3个商业化落地领域,你是否了解过?

    2015年的时候笔者开始关注GAN,公众号早期的文章中就有GAN的综述,这些年GAN的相关研究也是持续井喷.这一次咱们学术上的研究撇开不讲,这么多年过去了,GAN有哪些最成功的商业化落地领域? 图像生 ...

  2. 「杂谈」同学聚会最悲哀的事情

    「杂谈」同学聚会最悲哀的事情 大学毕业至今近乎20年了,期间参加过几次规模或大或小的同学聚会,有高中同学会聚会,初中同学聚会,也有大学同学聚会.这些同学聚会上,笔者发现其实体验都还很不错,基本没有发现 ...

  3. 「杂谈」计算机视觉人脸图像的十几个大的应用方向,你懂了几分?

    2020-02-16 13:45:50 文/编辑 | 言有三 人脸图像属于最早被研究的一类图像,也是计算机视觉领域中应用最广泛的一类图像,可以说掌握好人脸算法,基本就玩转了计算机视觉领域.在经历了几十 ...

  4. 杂篇-从整理文件发起的杂谈[-File-]

    有些东西很简单,简单到你不想去想,比如:为什么天是蓝的?--局限物语 零.前言 说一下本篇的初衷: coder盘作为工作盘有点乱,想整理一下 也想寻求一个方便管理工程的点子,既然File类玩的滚瓜烂熟 ...

  5. Android杂谈---获取手机屏幕大小

    Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...

  6. 【杂谈】野生在左 科班在右——数据结构学习誓师贴

    [杂谈]野生在左 科班在右--数据结构学习誓师贴 一. 科班 Vs 野生 这个老生常谈的问题让很多野生码农觉得不公平,在一次次面试中因为学历和那些工作中根本就用不到的知识虐的一脸懵逼,然后除了抱怨什么 ...

  7. 数据库内核杂谈 - 一小时实现一个基本功能的数据库

    我们摒弃直接介绍数据库内核各个模块的思路,而是从应用开发者的角度出发,来看实现一个数据库需要哪些基本功能,然后把这些功能细分成最小的模块再手把手一起实现. 对与应用开发者而言,一个数据库需要哪些必要的 ...

  8. Effective C++ --8 定制new和delete 9杂谈讨论

    上一篇Effective C++ --7 模板与泛型编程 Effective C++ --8 定制new和delete 49.了解new-handler的行为 (1)set_new_handler允许 ...

  9. JIT编译器杂谈#1:JIT编译器的血缘(一)

    这年头啥都得讲个娱乐性.专栏第一篇杂谈,先来点八卦轻松一下. 对我来说,有没有人最近用DJI无人机求婚成功啥的如同耳边一阵风:上周CoreCLR在GitHub上以MIT许可证开源了才是激动人心的娱乐新 ...

  10. 【杂谈】有三AI的一对一永久技术答疑服务,我们至少不会跑路

    万门大学的跑路暴雷大家肯定也都知道了,我们有几个关系比较好的做原创内容的同行曾经给它的宣传文案起了个名字,叫做"300勇士招募帖",因为我们认为去的是勇士.号称招募300个免费的学 ...

最新文章

  1. 2022-2028年中国光掩膜行业市场行情监测及未来前景规划报告
  2. 适合小团队作战,奖金+招聘绿色通道,这一届算法大赛关注下?
  3. R语言IQR函数计算四分位数范围IQR(Interquartile Range)实战
  4. lua 调用文件中的函数调用_四、C++获得Lua的变量和Table的值
  5. sql server之数据库语句优化
  6. 对财务客户开具Invoice(无销售流程)
  7. BUUCTF(misc)变异凯撒 --二
  8. python2与python3在absolute import的区别
  9. 网易云信携手海信S7,新社交开拓电视领域新未来
  10. 文献学习(part87)--Linearized Alternating Direction Method with Adaptive Penalty for Low-Rank ...
  11. python如何关闭窗口仍能运行_Python在退出时关闭自己的CMD shell窗口
  12. 工作56:element里面表单重置
  13. AI来袭程序猿是否该学习Python了
  14. devsecops_什么是DevSecOps?
  15. java浮点运算很难_关于Java:浮点运算不能产生精确结果
  16. 物流广告收入实现高速增长 国际投行看好京东转型潜力
  17. 修改设置Tomcat内存
  18. Atitit 命令行返回 cli 返回解析 tab分割csv格式 v4 t34.docx Atitit 命令行返回 cli 返回解析 csv 格式 cliutil 目录 1.1. 线使用tab
  19. python乱码怎么解决方法_python中文乱码的解决方法
  20. 摩莎485通讯测试软件,485串口测试软件1.6 免费版

热门文章

  1. CTFHUB log
  2. lecture09 Convex 模型预测控制(MPC)
  3. html 去掉html超链接下划线
  4. OnActionExecuting 中设置跳转指定网址或路由
  5. 最小生成树(普里姆算法)
  6. 俞敏洪:快乐是一种选择
  7. 18.Spring学习笔记_切面的优先级(by尚硅谷_佟刚)
  8. 盒须图(Boxplot)
  9. 判断字符串是否是数字
  10. Java - 关于HashMap通过keySet遍历kv的二次调用问题