springBoot 结合 redis(登录信息保存)

一:导入包:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

1.1 配置文件:

.yml 格式的:

redis:
  host: 127.0.0.1
  port: 6379

二:结合StringRedisTemplate 实现开发/

2.1  实现Cookie传值,因为集群开发的话,session值会变,A机  和 B机  的session值一定改变。因此需要种入Cookie值保证用户登录之后不会出现,登录到A机 就只能在A机使用了。一但请求转到B机,就要重新登录了。

写入Cookie

 public static void writeLoginToken(HttpServletResponse response,String token){
        Cookie ck = new Cookie(COOKIE_NAME,token);
        ck.setPath("/");
        ck.setHttpOnly(true);
        ck.setMaxAge(Redisconstant.EXPIRE); //保存时间
        log.info("write cookie name:{} , cookie vlaue: {}",ck.getName(),ck.getValue());
        response.addCookie(ck);
    }

读取Cookie
 

    public static String readLoginToken(HttpServletRequest request){
        Cookie[] cks = request.getCookies();
        if (cks != null){
            for (Cookie ck : cks){
                log.info("read cookie name:{} , cookie value:{}",ck.getName(),ck.getValue());
                if (StringUtils.equals(ck.getName(),COOKIE_NAME)){
                    return ck.getValue();
                }
            }
        }
        return null;
    }

删除Cookie(用于登出)

public static void delLoginToken(HttpServletResponse response,HttpServletRequest request){
        Cookie[] cks = request.getCookies();
        if (cks != null){
            for (Cookie ck : cks){
                if (StringUtils.equals(ck.getName(),COOKIE_NAME)){
                    ck.setPath("/");
                    ck.setMaxAge(0); //0 = del
                    log.info("del cookie name : {} ,cookie vlaue: {}",ck.getName(),ck.getValue());
                    response.addCookie(ck);
                    return;
                }
            }
        }
    }

2.2 得到Cookie值之后只要把Cookie的值放入到redis里面,设置一样的时间值,就实现了集群登录。

        String token = session.getId();
        Integer expire = Redisconstant.EXPIRE;
        //设置 token 至 redis
        redisTemplate.opsForValue().set(String.format(Redisconstant
.TOKEN_PREFIX,token),openid,expire, TimeUnit.SECONDS);

        //设置 token 至 cookie
        CookieUtil.writeLoginToken(httpServletResponse,token);

2.3结合使用

@Autowired
private StringRedisTemplate redisTemplate;
 @GetMapping("/login")
    public ModelAndView login(@RequestParam("openid") String openid,   //ModelAndView
                              HttpServletResponse httpServletResponse,
                              Map<String,Object> map, HttpSession session){
        // 数据库匹配
        SellerInfo sellerInfo = sellerService.findSellerInfoByOpenId(openid);  //通过关键字 查询用户
        if (sellerInfo == null){   // 判断用户是否存在
            map.put("msg",ResultEnum.LOGIN_FAIL.getMessage());
            map.put("url","你的页面地址");
            return new ModelAndView("/common/error");
        }
//        String token = UUID.randomUUID().toString();
        String token = session.getId();   //获取登录 token
        Integer expire = Redisconstant.EXPIRE;  //设置时间
        //设置 token 至 redis
        redisTemplate.opsForValue().set(
                //String TOKEN_PREFIX = "token_%s";
                String.format(Redisconstant.TOKEN_PREFIX,token) // key
                ,openid  //关键字  value
                ,expire,  // 时间
                TimeUnit.SECONDS);  //格式

        //设置 token 至 cookie
        CookieUtil.writeLoginToken(httpServletResponse,token);
        return new ModelAndView("你的页面地址 如 http://login");
    }

2.4登出

    @GetMapping("/logout")
    public ModelAndView logout(HttpServletRequest request,
                       HttpServletResponse response,
                       Map<String,Object> map){
        //cookie查询
        String token = CookieUtil.readLoginToken(request);
        if (StringUtils.isNotEmpty(token)){
            // 清除 redis
            redisTemplate.opsForValue().getOperations().delete(String.format(Redisconstant.TOKEN_PREFIX,token));

            // del cookie
            CookieUtil.delLoginToken(response,request);
        }
        map.put("msg",ResultEnum.LOGOUT_SUCCESS.getMessage());
        map.put("url","你的页面地址");
        return new ModelAndView("common/success",map);

    }
发布了37 篇原创文章 · 获赞 4 · 访问量 6824

猜你喜欢

转载自blog.csdn.net/m0_37918421/article/details/99633942