一:导入包:
<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;
}
}
}
得到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);
}
版权声明:本文为xajh_czbk原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。