在传统的种有住功前后端不分离项目中,大家在登录界面应该经常能看到记住我这个功能,关记这个功能本质上是新实现方为了让用户能在一段较长时间内不再重复登录,在以前的种有住功实现方案中,大家多使用 cookie 实现,关记本文给大家介绍在引入了 spring-session-redis 的新实现方项目中,使用一种新的种有住功实现方式,直接设置 redis 中用户 session 的关记有效期来实现。 本文使用 newbeepro 项目作为示例,新实现方给大家演示记住我功能的种有住功具体实现。项目地址:https://github.com/wayn111/newbee-mall-pro 本文大纲如下,关记  图片
 1. spring-session 的新实现方 yml 配置 图片
 在使用 spring-session 后,我们可以在 spring 的种有住功 yml 文件中设置 session 在 redis 中的 key 前缀,在 newbeepro 项目中,关记我们设置为 newbee_mall,新实现方然后我们设置过期时间 3600 秒,也就是一小时。 2. spring-session 的默认序列化方式复制@Configuration                        public class CacheConfig implements CachingConfigurer {                        /**                            * 指定spring-session的默认序列化方式                            *                            * @return RedisSerializer                            */                        @Bean("springSessionDefaultRedisSerializer")                        public RedisSerializer<Object> redisSerializer() {                        return valueSerializer();                        }                        private RedisSerializer<Object> valueSerializer() {                        return new GenericFastJsonRedisSerializer();                        }                        }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.                                                                添加 RedisSerializer 类的 bean 实例,并且设置 bean 名称是 springSessionDefaultRedisSerializer。b2b供应网注意 bean 名称必须是 springSessionDefaultRedisSerializer。 这一步不是必须的,作用是可以设置 spring-session-redis 的默认序列化实现。当我们设置为 fastjson 的序列化方式时,就可以让我们方便查看 redis 客户端。 3. 打开登录页面 图片
 当用户打开 newbeepro 项目前端页面时,用户 session 就已经在 redis 中保存了下来,这一点我们通过查看 redis 客户端发现,此时用户的 session 信息已经存在,并且有效期是 3600 秒与我们 yml 配置的过期时间是一致的。  图片
 4. 后端登录接口如何实现记住我复制@ResponseBody                        @PostMapping("/login")                        public R doLogin(MallUserVO mallUserVO,                        @RequestParam("destPath") String destPath,                        HttpSession session) {                        R success = R.success();                        MallUser user = mallUserService.getOne(Wrappers.<MallUser>lambdaQuery()                        .eq(MallUser::getLoginName, mallUserVO.getLoginName())                        .eq(MallUser::getPasswordMd5, Md5Utils.hash(mallUserVO.getPassword())));                        if (user == null) {                        return R.error("账户名称或者密码错误");                        }                        if (user.getLockedFlag() == 1) {                        return R.error("该账户已被禁用");                        }                        BeanUtils.copyProperties(user, mallUserVO);                        session.setAttribute(Constants.MALL_USER_SESSION_KEY, mallUserVO);                        String namespace = environment.getProperty("spring.session.redis.namespace");                        String sessionKey = namespace + ":sessions:" + session.getId()                        int timeout = Integer.parseInt(environment.getProperty("spring.session.timeout"));                        if (mallUserVO.isRememberme()) {                        redisCache.setCacheMapValue(sessionKey, "maxInactiveInterval", timeout * 24 * 7);                        } else {                        redisCache.setCacheMapValue(sessionKey, "maxInactiveInterval", timeout);                        }                        if (StringUtils.isNotEmpty(destPath) && StringUtils.contains(destPath, "=")) {                        success.add("destPath", destPath.split("=")[1].substring(1));                        }                        return success;                        }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.                                                                在登录接口中,我们可以通过 mallUserVO.isRememberme() 方法来判断用户是否点击了记住我按钮,在前面的第三步中,我们可以看到用户的 session 在 redis 中 的 key 名称是 newbee_mall:sessions:c3fd288e-c9c2-47e6-961b-a5e1e0a3205e。 这里给大家讲解一下这个 key 的拼接逻辑。  图片
 OK,云服务器提供商根据这个拼接逻辑,我们拼接 session key 的实现代码就是, 复制String namespace = environment.getProperty("spring.session.redis.namespace");                        String sessionKey = namespace + ":sessions:" + session.getId()1.2.                                            然后大家在用户 session key 的 hash 内容里可以发现有一个 hashKey 名称是 maxInactiveInterval,它就是用户 session 的有效期属性,我们可以通过改变 maxInactiveInterval 的属性值来延长用户 session 的有效期,以此来实现记住我功能。  图片
 那我们就可以通过 redisCache 实例来直接设置用户 session 的有效期,代码如下, 复制redisCache.setCacheMapValue(sessionKey, "maxInactiveInterval", timeout * 24 * 7)1.                                            5. 登录成功 当用户勾选了记住我按钮,登录成功后,我们来看下 redis 客户端,  图片
 OK,大功告成。 总结一下本文给大家讲解了在使用 spring-session-redis 的项目中,如何通过延长用户 session 的有效期来达到记住我功能的一致效果。 大家在学习本文后,也可以把记住我功能应用到自己的项目中,本文实例代码都在 newbeepro 项目中可以找到。  |