用户登录分布式session,用户添加 redis 设置cookie

<fastjson.version>1.2.38</fastjson.version>	
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
     <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
    </dependency>

加粗样式义接口

package com.etc.redis;

import java.security.PrivateKey;

/**
 * @Author Mr.findelist
 * @program: seckillplus
 * @Date 2020/7/22  16:01
 **/
public interface KeyPrefix {
    //存活时间
    int expirSeconds();
    //前缀
    String getPrefix();


}

实现接口

package com.etc.redis;

/**
 * @Author Mr.findelist
 * @program: seckillplus
 * @Date 2020/7/22  16:02
 **/

public class BasePrefix implements KeyPrefix{
   //时间
    private int expirSeconds;
   //key
    private  String prefix;

    public BasePrefix(int expirSeconds, String prefix) {
        this.expirSeconds = expirSeconds;
        this.prefix = prefix;
    }
    public BasePrefix( String prefix) {
        this(0,prefix);
    }

    @Override
    public int expirSeconds() {
        return expirSeconds;
    }

    @Override
    public String getPrefix() {
        return this.prefix;
    }
}

继承父类

package com.etc.redis;

/**
 * @Author Mr.findelist
 * @program: seckillplus
 * @Date 2020/7/22  16:02
 **/

public class MiaoShaUserKey extends BasePrefix {
    public static final int TOKEN_EXPIER = 3600 * 24 * 2;
    public static MiaoShaUserKey token=new MiaoShaUserKey(TOKEN_EXPIER,"tk");


    public MiaoShaUserKey(int expirSeconds, String prefix) {
        super(expirSeconds, prefix);
    }

    public MiaoShaUserKey(String prefix) {
        super(prefix);
    }
}

设置缓存类

package com.etc.redis;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.time.Duration;


/**
 * @Author Mr.findelist
 * @program: seckillplus
 * @Date 2020/8/8  20:14
 **/
@Service
public class RedisService {


    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    public void set(BasePrefix basePrefex, String key, Object value) {
       // String beantostring = beantostring(value);
        stringRedisTemplate.opsForValue().set(basePrefex.getPrefix() + key, value.toString());
        if (basePrefex.expirSeconds() != 0) {
            redisTemplate.expire(basePrefex.getPrefix() + key, Duration.ofSeconds(basePrefex.expirSeconds()));
        }
    }

    /**
     * 累加
     * @param basePrefex
     * @param key
     */
    public void incr(BasePrefix basePrefex, String key) {
        stringRedisTemplate.opsForValue().increment(basePrefex.getPrefix() + key, 1);
    }

    public <T> T get(BasePrefix basePrefex, String key, Class<T> tClass) {
        String s = stringRedisTemplate.opsForValue().get(basePrefex.getPrefix() + key);
        return stringToBean(s, tClass);
    }

    public void get(BasePrefix basePrefex) {
    }

    public String beantostring(Object obj) {
        return JSON.toJSONString(obj);
    }

    public <T> T stringToBean(String str, Class<T> tClass) {
        if (StringUtils.isEmpty(str)) {
            return null;
        }
        if (tClass == int.class || tClass == Integer.class) {
            return (T) Integer.valueOf(str);
        } else if (tClass == Long.class | tClass == Long.class) {
            return (T) Long.valueOf(str);
        } else if (tClass == String.class) {
            return (T) str;
        } else {
            return JSON.toJavaObject(JSON.parseObject(str), tClass);
        }
    }
}

写缓存 添加cookie

package com.etc.service.impl;

import com.alibaba.fastjson.JSON;
import com.etc.common.AbnoNum;
import com.etc.dao.UserDao;
import com.etc.domian.User;
import com.etc.domian.bo.UserBo;
import com.etc.exitpation.BizExiption;
import com.etc.redis.MiaoShaUserKey;
import com.etc.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.SessionAttributes;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

/**
 * @Author Mr.findelist
 * @program: seckill
 * @Date 2020/7/20  15:52
 **/
@SessionAttributes({"user"})
@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    public static final String COOKIE_TOKEN_NAME = "token";



    @Override
    public User findById(Long id) {
        return userDao.selectById(id);
    }

    @Override
    public boolean login(UserBo userBo, HttpServletResponse response, String y, ModelMap map, HttpServletRequest request) {
        if (userBo == null) {
            //用户名或密码为空
            throw new BizExiption(AbnoNum.USERNAME_IS_NULL.getResCode(), AbnoNum.USERNAME_IS_NULL.getRestMsg());
        }
         User user = findById(userBo.getId());
        if (user == null) {
            //用户不存在
            throw new BizExiption(AbnoNum.USERNAME_IS_ENIST.getResCode(), AbnoNum.USERNAME_IS_ENIST.getRestMsg());
        }
        if (!userBo.getPassword().equals(user.getPassword())) {
            //密码错误
            throw new BizExiption(AbnoNum.USERPASS_IS_ERROR.getResCode(), AbnoNum.USERPASS_IS_ERROR.getRestMsg());
        }

        if(userBo.getPassword().equals(user.getPassword())){
             //写入cookie
                String tokenuuid = UUID.randomUUID().toString().replace("-", "");
                addcookie(response, tokenuuid, user);
                map.put("user",user);
            request.getSession().setAttribute("user",user);
            return true;
        }
         return false;
    }

    @Override
    public int updateById(User user) {

        return userDao.updateById(user);
    }

    private void addcookie(HttpServletResponse response, String tokenuuid, User user) {
        //写缓存
        String s = JSON.toJSONString(user);
        stringRedisTemplate.opsForValue().set(MiaoShaUserKey.token.getPrefix() + ":" + tokenuuid, s);

         Cookie cookie = new Cookie(COOKIE_TOKEN_NAME,tokenuuid);
        //设置过期时间(以秒为单位)
        cookie.setMaxAge(MiaoShaUserKey.TOKEN_EXPIER);
        //设置添加到根路径下
        cookie.setPath("/");
        //添加Cookie
        response.addCookie(cookie);


    }

    /**
     * 根据cookie获取用户
     * @param response
     * @param tokenuuid
     * @return
     */
    @Override
    public User getcookie(HttpServletResponse response, String tokenuuid) {
        if (StringUtils.isEmpty(tokenuuid)) {
            return null;
        }
        String s = stringRedisTemplate.opsForValue().get(MiaoShaUserKey.token.getPrefix() + ":" + tokenuuid);
        User user = JSON.parseObject(s, User.class);
        /*if (user != null) {
            addcookie(response, tokenuuid, user);
        }*/
        return user;
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值