程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

Redis实现Single单点登入--系统框架搭建(一)

发布于2021-06-12 12:34     阅读(581)     评论(0)     点赞(7)     收藏(5)


环境需求:redis3.8.2+maven+springBoot+jdk1.8+freemarker模板

1、需求背景

周末在家,上家同事突然联系,让我给他网站做单点登入功能,于是自己先梳理逻辑,实现功能并且记录下来。

单点登入(Single sign on)顾名思义,就是在一个网站登入之后,其他网站就不需要用户继续输入账号密码,而能免密登入,这种技术在大型网站都使用的非常频繁,比如阿里巴巴,当用户登入他们系统后,每个子系统都能自动登入,如果大家在登入某宝之后,登入某碑,也需要密码,登入淘宝也需要重新输入密码,这肯定会造成用户体验极差,而且系统的认证逻辑也会很麻烦,这时候单点登入就出现了。

  

2、代码实例

         本文演示两个系统

  1. @Slf4j
  2. @RestController
  3. @RequestMapping("/redis/single")
  4. public class RedisSingleController {
  5. private static final String NAME = "name";
  6. private static final String PASSWORD = "password";
  7. @Resource
  8. private RedisTemplate redisTemplate;
  9. @GetMapping("/login_page")
  10. public ModelAndView loginPage(){
  11. ModelAndView mv = new ModelAndView();
  12. mv.setViewName("loginPage");
  13. return mv;
  14. }
  15. /**
  16. * 系统1
  17. * @return
  18. */
  19. @GetMapping("/system1")
  20. public ModelAndView system1(HttpServletRequest request){
  21. ModelAndView mv = new ModelAndView();
  22. if(redisTemplate.hasKey("name")){
  23. mv.setViewName("systemOnePage");
  24. return mv;
  25. }
  26. request.getSession().setAttribute("goUrl","indexSystem1");
  27. mv.setViewName("loginPage");
  28. return mv;
  29. }
  30. /**
  31. * 系统2
  32. * @return
  33. */
  34. @GetMapping("/system2")
  35. public ModelAndView system2(HttpServletRequest request){
  36. ModelAndView mv = new ModelAndView();
  37. if(redisTemplate.hasKey("name")){
  38. mv.setViewName("systemTwoPage");
  39. return mv;
  40. }
  41. request.getSession().setAttribute("goUrl","indexSystem2");
  42. mv.setViewName("loginPage");
  43. return mv;
  44. }
  45. /**
  46. * 效验账号密码是否正常
  47. * @param name
  48. * @param password
  49. * @return
  50. */
  51. @PostMapping("/detection")
  52. @ResponseBody
  53. public Map<String, Object> index( String name, String password, String gotoUrl){
  54. Map<String, Object> map = new HashMap<>();
  55. if(!ObjectUtil.equals(name,NAME) || !ObjectUtil.equals(password,PASSWORD)){
  56. map.put("flag",false);
  57. map.put("data","账号密码不匹配!");
  58. return map;
  59. }
  60. map.put("flag",true);
  61. map.put("data","账号密码正确!");
  62. //redis缓存20s失效
  63. redisTemplate.opsForValue().set("name",name,10, TimeUnit.SECONDS);
  64. return map;
  65. }
  66. /**
  67. * 登入成功,系统一进入首页
  68. * @return
  69. */
  70. @GetMapping("/indexSystem1")
  71. @ResponseBody
  72. public ModelAndView index(){
  73. ModelAndView mv = new ModelAndView();
  74. mv.setViewName("systemOnePage");
  75. return mv;
  76. }
  77. /**
  78. * 登入成功,系统二进入首页
  79. * @return
  80. */
  81. @GetMapping("/indexSystem2")
  82. @ResponseBody
  83. public ModelAndView indexSystem2(){
  84. ModelAndView mv = new ModelAndView();
  85. mv.setViewName("systemTwoPage");
  86. return mv;
  87. }

1、保证访问系统一登入页面时,进入的是系统一首页,访问系统二登入页面时,进入的是系统二首页。

2、在访问系统一或者系统二时,都需要判断redis里是否存在当前用户,存在则免密登入。

3、逻辑处理,在登入先判断数据库里的账号密码是否正确,若用户在页面登入正确,则返回登入成功,并且存入redis,给他设置过期时间。

4、保证在redis过期时间内其他子系统都能免密登入。

 

springBoot+redis实现登入拦截器--系统框架搭建(二)

https://blog.csdn.net/ke1ying/article/details/117822312?spm=1001.2014.3001.5501

最后,看到这里的读者,如果喜欢的话安排一波(点赞,收藏,关注),原创不易,每周定期分享小知识。

原文链接:https://blog.csdn.net/ke1ying/article/details/117787334



所属网站分类: 技术文章 > 博客

作者:niceboty

链接:http://www.javaheidong.com/blog/article/221876/71627ea6941e3c5be682/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

7 0
收藏该文
已收藏

评论内容:(最多支持255个字符)