登录信息(session)存储方式总结
1、前端存储cookie 用户登录时判断完用户名密码等,将登录对象加密返回到前端,前端用ajax将登录对象存入cookie,此后鉴权等操作都利用cookie解密登录对象进行用户验证。 封装一个cookieUtil从request对象中获取cookie信息进行解密使用。 参考项目:antifatigueManufacturing
2、后端存储session
User user = userMapper.selectById(mobile); if (null == user) { throw new GlobalException(RespBeanEnum.LOGINERROR); } String pass = Md5Util.formPassToDBPass(password, user.getSalt()); if (!pass.equals(user.getPassword())) { throw new GlobalException(RespBeanEnum.LOGINERROR); } //使用uuid作为session的键,并将其存到cookie中 String ticket = UUIDUtil.uuid(); CookieUtil.setCookie(request,response,"userTicket",ticket); //将用户对象存入session,用uuid做为键 request.getSession().setAttribute(ticket,user);在需要提取session信息时,先从cookie中获取session的键-uuid.
@GetMapping("toList") //使用注解获取cookie的值 public String toList(HttpSession session, Model model,@CookieValue("userTicket") String ticket) { //从cookie中获取uuid if (StringUtils.isBlank(ticket)) { return "login"; } //用获取的uuid取出session中的用户对象 User user = (User) session.getAttribute(ticket); if (null == user) { return "login"; } model.addAttribute("user",user); return "goodsList"; }参考项目:seckill 此项目要改造为分布式session方案的话只需要引入三个maven依赖和redis的配置。
org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2 org.springframework.session spring-session-data-redis引入spring-session依赖并配置好redis,重启项目后即可看到session被存储到了redis中。
3、直接将用户信息存储在redis中 将以上spring-session-data-redis依赖删除,配置文件中配置好redis,创建好redisTemplate配置类,在业务逻辑中使用redisTemplate调用redis,将用户信息存储在redis中。 redis配置类:
@Configurationpublic class RedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate(); //给存入redis的键String做序列化,保证能得到正确的键 redisTemplate.setKeySerializer(new StringRedisSerializer()); //给存入redis的值对象做序列化, // GenericJackson2JsonRedisSerializer是通用的,可得到json数据,不用传入对象本身 // Jackson2JsonRedisSerializer() 得到json数据,但要传入类对象 // JdkSerializationRedisSerializer() 是redis默认的序列化,将对象转化为二进制 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //设置redis的hash数据类型 //设置hash的key redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //设置hash的value redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); //注入连接工厂 redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; }业务代码:
//存信息//使用uuid作为session的键,并将其存到cookie中 String ticket = UUIDUtil.uuid(); CookieUtil.setCookie(request,response,"userTicket",ticket); //将用户对象存入session,用uuid做为键 //request.getSession().setAttribute(ticket,user); //将用户信息放入redis,代替session redisTemplate.opsForValue().set("user:"+ticket,user);//取信息@Override public User getUserByCookie(String userTicket, HttpServletRequest request, HttpServletResponse response) { if (StringUtils.isBlank(userTicket)) { return null; } User user = (User) redisTemplate.opsForValue().get("user:" + userTicket); //以防万一的操作,给cookie重新赋值 if (null != user) { CookieUtil.setCookie(request,response,"userTicket",userTicket); } return user; }实现分布式session的基本思路就是将session或要存储在session中的用户信息放在单独的容器中。