zoukankan      html  css  js  c++  java
  • 「小程序JAVA实战」开发用户redis-session(40)

    转自:https://idig8.com/2018/09/05/xiaochengxujavashizhankaifayonghuredis-session39/

    接下来我们需要在我们的项目里面配置下,我们的redis的配置。源码:https://github.com/limingios/wxProgram.git 中的wx-springboot 和 No.15

    springboot-wx增加配置

    • common 增加一个pom.xml的redis依赖
        <!-- 引入 redis 依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>1.8.7.RELEASE</version>
            </dependency>
    

    • common 增加工具类RedisOperator
      >操作redis的工具类
    package com.idig8.utils;
    
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     * @Description: 使用redisTemplate的操作实现类 
     */
    @Component
    public class RedisOperator {
    
    //  @Autowired
    //    private RedisTemplate<String, Object> redisTemplate;
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        // Key(键),简单的key-value操作
    
        /**
         * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
         * 
         * @param key
         * @return
         */
        public long ttl(String key) {
            return redisTemplate.getExpire(key);
        }
    
        /**
         * 实现命令:expire 设置过期时间,单位秒
         * 
         * @param key
         * @return
         */
        public void expire(String key, long timeout) {
            redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
        }
    
        /**
         * 实现命令:INCR key,增加key一次
         * 
         * @param key
         * @return
         */
        public long incr(String key, long delta) {
            return redisTemplate.opsForValue().increment(key, delta);
        }
    
        /**
         * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
         */
        public Set<String> keys(String pattern) {
            return redisTemplate.keys(pattern);
        }
    
        /**
         * 实现命令:DEL key,删除一个key
         * 
         * @param key
         */
        public void del(String key) {
            redisTemplate.delete(key);
        }
    
        // String(字符串)
    
        /**
         * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
         * 
         * @param key
         * @param value
         */
        public void set(String key, String value) {
            redisTemplate.opsForValue().set(key, value);
        }
    
        /**
         * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
         * 
         * @param key
         * @param value
         * @param timeout
         *            (以秒为单位)
         */
        public void set(String key, String value, long timeout) {
            redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
        }
    
        /**
         * 实现命令:GET key,返回 key所关联的字符串值。
         * 
         * @param key
         * @return value
         */
        public String get(String key) {
            return (String)redisTemplate.opsForValue().get(key);
        }
    
        // Hash(哈希表)
    
        /**
         * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
         * 
         * @param key
         * @param field
         * @param value
         */
        public void hset(String key, String field, Object value) {
            redisTemplate.opsForHash().put(key, field, value);
        }
    
        /**
         * 实现命令:HGET key field,返回哈希表 key中给定域 field的值
         * 
         * @param key
         * @param field
         * @return
         */
        public String hget(String key, String field) {
            return (String) redisTemplate.opsForHash().get(key, field);
        }
    
        /**
         * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
         * 
         * @param key
         * @param fields
         */
        public void hdel(String key, Object... fields) {
            redisTemplate.opsForHash().delete(key, fields);
        }
    
        /**
         * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
         * 
         * @param key
         * @return
         */
        public Map<Object, Object> hgetall(String key) {
            return redisTemplate.opsForHash().entries(key);
        }
    
        // List(列表)
    
        /**
         * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头
         * 
         * @param key
         * @param value
         * @return 执行 LPUSH命令后,列表的长度。
         */
        public long lpush(String key, String value) {
            return redisTemplate.opsForList().leftPush(key, value);
        }
    
        /**
         * 实现命令:LPOP key,移除并返回列表 key的头元素。
         * 
         * @param key
         * @return 列表key的头元素。
         */
        public String lpop(String key) {
            return (String)redisTemplate.opsForList().leftPop(key);
        }
    
        /**
         * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。
         * 
         * @param key
         * @param value
         * @return 执行 LPUSH命令后,列表的长度。
         */
        public long rpush(String key, String value) {
            return redisTemplate.opsForList().rightPush(key, value);
        }
    
    }
    

    • api 项目 配置文件内增加内容application.properties
    ############################################################
    #
    # REDIS 配置
    #
    ############################################################
    # Redis数据库索引(默认为0)
    spring.redis.database=1
    # Redis服务器地址
    spring.redis.host=47.98.XXX.XXX
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=XXXX
    # 连接池最大连接数(使用负值表示没有限制)
    spring.redis.pool.max-active=1000
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.pool.max-wait=-1
    # 连接池中的最大空闲连接
    spring.redis.pool.max-idle=10
    # 连接池中的最小空闲连接
    spring.redis.pool.min-idle=2
    # 连接超时时间(毫秒)
    spring.redis.timeout=0
    

    • api 项目中增加基础的Controller
    package com.idig8.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.idig8.utils.RedisOperator;
    
    @RestController
    public class BasicController {
    
        @Autowired
        public RedisOperator redis;
    
    
        /**
         * 用户session的分类名称
         */
        public static final String USERS_REDIS_SESSION = "user-redis-session";
    
        /**
         * 用户session的失效时间
         */
        public static final long USERS_REDIS_SESSION_TL = 1000*60*30;
    }
    
    

    • api 项目中增加RegistLoginController增加userToken

    用户登录和注册后,redis内添加对应的userToken信息。

    package com.idig8.controller;
    
    import java.util.UUID;
    
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.BeanUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.idig8.pojo.Users;
    import com.idig8.pojo.vo.UsersVO;
    import com.idig8.service.UserService;
    import com.idig8.utils.JSONResult;
    import com.idig8.utils.MD5Utils;
    
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    
    @RestController
    @Api(value="用户注册登录的接口",tags={"注册和登录的controller"})
    public class RegistLoginController extends BasicController{
    
        @Autowired
        private UserService userService;
    
    
        @ApiOperation(value="用户注册",notes="用户注册的接口")
        @PostMapping("/regist")
        public JSONResult regist(@RequestBody Users user) {
            //1.判断用户名和密码不能为空
            if(StringUtils.isBlank(user.getUsername())||StringUtils.isBlank(user.getPassword())) {
                return JSONResult.errorMsg("用户名或密码不能为空");
            }
    
            //2.判断用户名是否存在
            boolean usernameIsExist = userService.queryUsernameIsExist(user.getUsername());
            if(!usernameIsExist) {
                user.setNickname(user.getUsername());
                try {
                    user.setPassword(MD5Utils.getMD5Str(user.getPassword()));
                } catch (Exception e) {
    
                    return JSONResult.errorMsg(e.getMessage());
                }
                user.setFollowCounts(0);
                user.setReceiveLikeCounts(0);
                user.setFansCounts(0);
                userService.saveUser(user);
            }else {
                return JSONResult.errorMsg("用户名或已经存在,请更换在试试!");
            }
    
            UsersVO userVO = setUserRedisSessionToken(user);
    
            return JSONResult.ok(userVO);
        }
    
        @ApiOperation(value="用户登录",notes="用户登录的接口")
        @PostMapping("/login")
        public JSONResult login(@RequestBody Users user) {
            //1.判断用户名和密码不能为空
            if(StringUtils.isBlank(user.getUsername())||StringUtils.isBlank(user.getPassword())) {
                return JSONResult.errorMsg("用户名或密码不能为空");
            }
    
            //2.判断用户名是否存在
            Users userObject = userService.queryUserIsExist(user);
    
            if(userObject==null){
                return JSONResult.errorMsg("用户名或密码不存在!");
            }
    
            UsersVO userVO = setUserRedisSessionToken(userObject);
            return JSONResult.ok(userVO);
        }
    
        public UsersVO setUserRedisSessionToken(Users userModel) {
            String uniqueToken = UUID.randomUUID().toString();
            redis.set(USERS_REDIS_SESSION + ":" + userModel.getId(), uniqueToken, USERS_REDIS_SESSION_TL);
    
            UsersVO userVO = new UsersVO();
            BeanUtils.copyProperties(userModel, userVO);
            userVO.setUserToken(uniqueToken);
            return userVO;
        }
    }
    
    

    启动小程序

    • 注册页面

    • 输入要注册的用户名和密码查看返回

    • redis内容发生了增加
      >redis里面的值和我们前端设置的userToken唯一的值维系了两个之间的关系,这就是一种无状态的session,

    • 登录页面
      >使用刚才注册的一个用户名,进行登录

    image.png

    • 输入要用户名和密码查看返回

    redis 增加冒号的作用:

    进行分类,缓存到同一个文件夹方便查看数据。前面一个分类名称中间一个冒号,丢到缓存里面。

    PS:这就是本次springboot的redis-session的使用。

  • 相关阅读:
    uniapp版本迭代
    上传图像裁剪功能
    uniapp 复制到剪切板
    uniapp吸顶功能
    地图导航到目的地
    uniapp视频图片上传
    获取昨天今天明天的时间
    【VUE】 前端面试题小结
    vue获取当前时间 实时刷新
    CSS linear-gradient() 函数
  • 原文地址:https://www.cnblogs.com/sharpest/p/10296897.html
Copyright © 2011-2022 走看看