基于Redis+Cookie实现Session共享

分布式项目中要实现单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.comc.com)都认为已经登录。
比如用户在登录淘宝后,跳转到天猫时就已经登录了。

通过redis缓存和cookie实现单点登录:

共享Session

登录接口逻辑处理:

 
  1. @ResponseBody
  2. @RequestMapping("/dologin")
  3. public Result<String> doLogin(String nickname,String password,HttpServletResponse response){
  4. User loginUser = userDao.selectUserByNickName(nickname);
  5. if(loginUser == null){
  6. return Result.error(CodeMsg.NICKNAME_NOT_EXIST);
  7. }
  8. String salt = loginUser.getSalt();
  9. //将表单提交的密码二次md5
  10. String s = Md5Utils.formPassToDb(password, salt);
  11. //验证密码
  12. if(s.equals(loginUser.getPassword())){
  13. //生成随机的token
  14. String token = UUIDUtil.uuid();
  15. //将token和用户作为key与value存入缓存
  16. redisService.set(MiaoSha_UserKey.userKeyToken,token,loginUser);
  17. //封装cookie
  18. Cookie cookie = new Cookie(COOKIE_NAME,token);
  19. //设置cookie过期时间
  20. cookie.setMaxAge(MiaoSha_UserKey.userKeyToken.getExpireSeconds());
  21. cookie.setPath("/");
  22. response.addCookie(cookie);
  23. return Result.success(token);
  24. }
  25. return Result.error(CodeMsg.SERVER_ERROR);
  26. }

在其他接口中获取到登录用户,自定义一个参数解析器HandlerMethodArgumentResolver
在进行参数判断中可自定义一个注解,当某个参数被使用该注解后,则调用自定义的参数管理器

 
  1. @Target(value = ElementType.PARAMETER)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface UserParameter {
  5. }

HandlerMethodArgumentResolver :

 
  1. @Component
  2. public class UserArgumentResolver implements HandlerMethodArgumentResolver {
  3. @Autowired
  4. private UserService userService;
  5. //先判断参数类型和是否贴了自定义注解,满足则进行下一步
  6. @Override
  7. public boolean supportsParameter(MethodParameter parameter) {
  8. return parameter.getParameterType() == User.class && parameter.hasParameterAnnotation(UserParameter.class);
  9. }
  10. @Override
  11. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory){
  12. HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
  13. Cookie[] cookies = request.getCookies();
  14. if(cookies == null || cookies.length <=0){
  15. return null;
  16. }
  17. String token = null;
  18. for(Cookie cookie : cookies){
  19. if(cookie.getName().equals(LoginController.COOKIE_NAME)){
  20. //拿到token
  21. token = cookie.getValue();
  22. break;
  23. }
  24. }
  25. User user = userService.getUserByToken(token);
  26. return user;
  27. }
  28. }

遍历所有的cookie,直到找到登录时设置的 public static final String COOKIE_NAME = "token"; 获取该cookie的值(token)并查找redis拿到用户

将自定义解析器配置到springmvc管理:

 
  1. @Configuration
  2. public class WebMvcConfig implements WebMvcConfigurer {
  3. @Autowired
  4. private UserArgumentResolver userArgumentResolver;
  5. @Override
  6. public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
  7. resolvers.add(userArgumentResolver);
  8. }
  9. }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132243.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序中使用echarts的相关配置以及折线图案例(简单易懂)

第一步&#xff1a;引入echarts文件--此文件需要下载&#xff1a; 下载地址&#xff1a;点击此处进行下载echarts文件 点击Download ZIP下载压缩包&#xff0c;注意&#xff1a;e-canvas是我从完整的文件中剥离出来的有用的&#xff0c;不会影响项目。 第二步&#xff1a;把整…

易点易动让企业实现低值易耗品的智能化采购管理

对于企业而言&#xff0c;低值易耗品的采购和管理是一项重要的任务。然而&#xff0c;传统的采购管理方式往往繁琐且耗时&#xff0c;容易导致资源浪费和效率低下。为了解决这些问题&#xff0c;我们推出了易点易动采购管理系统&#xff0c;它以其高效、便捷和智能化的特点&…

你知道期权和期货有什么关联和区别吗?解析一下!

随着金融市场的不断发展&#xff0c;期权和期货成为了两种常见的金融衍生品&#xff0c;它们都具有规避风险和发现价格的功能。很多入门不知道期权和期货哪个更好&#xff0c;下文科普你知道期权和期货有什么关联和区别吗&#xff1f;解析一下&#xff01;本文来源&#xff1a;…

wps演示时图片任意位置拖动

wps演示时图片任意位置拖动 1.wps11.1版本&#xff0c;其他版本的宏插件可以自己下载。2.先确认自己的wps版本是不是11.13.检查是否有图像工具4.检查文件格式和安全5.开发工具--图像6.选中图像控件&#xff0c;右击选择查看代码&#xff0c;将原有代码删除&#xff0c;将下边代…

前端-Vue-element-开发指南

电商管理系统框架 Vue-element 电商管理系统 电商管理系统框架1 介绍了解 项目实战的学习目标2 电商项目基本业务概述3 后台管理系统功能划分4 项目开发模式技术选型5 项目初始化可视化面板 配置 6 配置码云SSH7 托管云8 安装mysql9 API服务器Postman调试10 分析登陆和token原理…

基于FPGA的图像缩小算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的处理结果导出到matlab中显示图像效果&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1p…

unity发布微信小游戏,未找到 game.json报错原因

unity发布微信小游戏&#xff0c;未找到 game.json报错原因 同一个问题相隔一年遇到两次&#xff0c;两次原因都不一样&#xff0c;记录一下&#xff0c;以后不要再掉坑里 原因一&#xff1a;申请的appID是小程序不是小游戏 解决方法&#xff1a;需要在程序平台修改服务类目 如…

web 基础和http 协议

一、域名 域名的概念 IP地址不易记忆&#xff0c;域名方便记住&#xff0c;以便于用户进行搜索访问 早期使用Hosts文件解析域名地址 缺点&#xff1a; ① 主机名称重复 ② 主机维护困难 DNS&#xff08;Domain Name System&#xff09;域名系统 ① 分布式 将一个大的数…

2023 NewStarCTF --- wp

文章目录 前言Week1MiscCyberChefs Secret机密图片流量&#xff01;鲨鱼&#xff01;压缩包们空白格隐秘的眼睛 Web泄露的秘密Begin of UploadErrorFlaskBegin of HTTPBegin of PHPR!C!E!EasyLogin CryptobrainfuckCaesars SecertfenceVigenrebabyrsaSmall dbabyxorbabyencodin…

Nginx proxy_set_header参数设置

一、不设置 proxy_set_header Host 不设置 proxy_set_header Host 时&#xff0c;浏览器直接访问 nginx&#xff0c;获取到的 Host 是 proxy_pass 后面的值&#xff0c;即 $proxy_host 的值&#xff0c;参考Module ngx_http_proxy_module 1 2 3 4 5 6 7 8 # cat ngx_header.c…

U盘怎么设置为只读?U盘怎么只读加密?

当将U盘设置为只读模式时&#xff0c;将只能查看其中数据&#xff0c;无法对其中数据进行编辑、复制、删除等操作。那么&#xff0c;怎么将U盘设置成只读呢&#xff1f; U盘如何设置成只读&#xff1f; 有些U盘带有写保护开关&#xff0c;当打开时&#xff0c;U盘就会处于只读…

Arduino是如何实现打开串口时,程序复位的?

引言 使用过Arduino的都应该发现过&#xff0c;在打开Arduino IDE自带的COM串口助手的时候&#xff0c;Arduino开发板会复位。在打开其他串口助手的时候也会。这是为什么呢&#xff1f; 原因分析 首先看看arduino的原理图&#xff1a; 我们可以看看与复位引脚相关的部…