redis的java客户端jedis案例

 

easymall-user-service

new ObjectMapper().writeValueAsString(Object); 将数据转化为json格式

用户登陆校验,状态的获取

接口文件

后台接收/user/manage/login
请求方式 Post
请求参数 User user 只有用户名和密码,查询需要加密password
返回数据 返回SysResult对象的json,其结构: Integer status; 200表示成功,其他表示失败 String msg;成功返回 “ok”,失败返回其他信息 Object data;根据需求携带其他数据
备注1 需要使用redis存储查询到的user数据,并且利用cookie传递回浏览器,以便下次访问携带cookie完成用户状态的请求
备注2 Redis存储的用户数据,ticket生成公式:”EM_TICKET”+currentTime+userId;value就是userJson
备注3 可以利用这里的登录逻辑,控制一个用户最多的登录个数

 

后台接收/user/manage/query/{ticket}
请求方式 Get
请求参数 String ticket 就是用户登录时生成的redis中key值
返回数据 返回SysResult对象的json,其结构: Integer status; 200表示成功,其他表示失败 String msg;成功返回 “ok”,失败返回其他信息 Object data;封装从redis获取的userJson

 

pom.xml

添加redis的简化依赖

     <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-redis</artifactId>
          <version>1.4.7.RELEASE</version>
     </dependency>

src/main/resourses

application.properties

 server.port=10003
 ​
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
 spring.datasource.url=jdbc:mysql:///easydb
 spring.datasource.username=root
 spring.datasource.password=root
 #druid datasource
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 #mybatis
 mybatis.mapperLocations=classpath:mapper/*.xml
 mybatis.typeAliasesPackage=com.jt.common.pojo
 mybatis.configuration.mapUnderscoreToCamelCase=true
 mybatis.configuration.cacheEnabled=false
 #eureka client
 spring.application.name=userservice
 eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka
 

mapper

UserMapper.xml
 
<?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.wiscom.user.mapper.UserMapper">
     <select id="checkUsername" parameterType="String" 
     resultType="int">
         select count(user_id) from t_user where
         user_name=#{userName}
     </select>
     <insert id="saveUser" parameterType="User">
         insert into t_user (
         user_id,user_name,user_password,
         user_nickname,user_email,user_type
         ) values (
         #{userId},#{userName},#{userPassword},
         #{userNickname},#{userEmail},#{userType}
         )
     </insert>
     <select id="queryExist" parameterType="User"
     resultType="User">
         select * from t_user where user_name=#{userName}
         and user_password=#{userPassword}
     </select>
 </mapper> 

 

src/main/java

cn.wiscom
StarterUserService.java
package cn.wiscom;
 ​
 @SpringBootApplication
 @EnableEurekaClient
 @MapperScan("cn.wiscom.user.mapper")
 public class StarterUserService {
     public static void main(String[] args) {
         SpringApplication.run(StarterUserService.class, args);
     }
     //在启动类中可以按照一个配置类来编写所有需要的配置内容
 }
cn.wiscom.user.controller
UserController.java
package cn.wiscom.user.controller;
 ​
 @RestController
 @RequestMapping("user/manage")
 public class UserController {
     @Autowired
     private UserService userService;
     /*
     //校验用户名是否存在
     @RequestMapping("checkUserName")
     public SysResult checkUsername(String userName){
         //控制层判断反回数据
         int exist=userService.checkUsername(userName);
         if(exist==0){//不存在,可用
             return SysResult.ok();//status=200
         }else{//存在,不可用
             return SysResult.build(201, "", null);
         }
     }
     
     //注册表单提交
     @RequestMapping("save")
     public SysResult saveUser(User user){
         //判断成功失败结构
         try{
             userService.saveUser(user);
             return SysResult.ok();
         }catch(Exception e){
             e.printStackTrace();
             return SysResult.build(201, "", null);
         }
     }
   */  
     //根据接口文件实现登录的校验,通过正确登录的
     //用户存储在redis中
     @RequestMapping("login")
     public SysResult login(User user,
             HttpServletRequest req,
             HttpServletResponse res){
         //调用业务层 获取redis中存储的key值 ticket
         String ticket=userService.login(user);
         //判断失败和成功
         if("".equals(ticket)){//没有正确生成redis的
         //key 说明登录失败的
             return SysResult.build(201, "", null);
         }else{
         //正确存储了数据到redis并且登录时成功的
             //cookie存放一个值, EM_TICKET
             //CookieUtils
             CookieUtils.setCookie(req, res, 
                     "EM_TICKET", ticket);
             return SysResult.ok();
         }
     }
     
     //用户登录状态获取
     @RequestMapping("query/{ticket}")
     public SysResult queryUserJson(@PathVariable
             String ticket){
         String userJson0
             userService.queryUserJson(ticket);
         //如果redis数据不存在,返回时null还是""
         if(userJson==null){
             //登录状态不存在,不是ticket时错的,就是超时了
             return SysResult.build(201, "", null);
         }else{
             //登录状态合法
             //function(data){
             //  data.status 判断200还是非200
             //  data.msg 获取交流信息
             //  data.data==userJson
             //  data.data.userName==eeee}
             return SysResult.build(200, "ok", userJson);
         }
     }
 }
cn.wiscom.user.service
UserService.java
package cn.wiscom.user.service;
 ​
 @Service
 public class UserService {
     /*private static final String userSaveSuffix="user_save";
     private static final String productUpdate="product_update";
     */
     @Autowired
     private UserMapper userMapper;
     public int checkUsername(String userName) {
         //select count(user_id)
         return userMapper.checkUsername(userName);
     }
     public void saveUser(User user) {
         //加密password
         String md5Password=
         MD5Util.md5(user.getUserPassword());
         user.setUserPassword(md5Password);
         //登录比对校验数据的userPassword也加密比对
         //补充userId
         user.setUserId(UUID.randomUUID().toString());
         userMapper.saveUser(user);
     }
     public String login(User user) {
         /*对user的password进行加密
          *调用持久层方法 select * from t_user where
          *user_name=参数 and user_password=参数 
          *existUser==null 登录失败 return ""
          *existUser!=null 登录成功
          *  将existUser转化成json字符串 ObjectMapper.writeValueAsString
          *  key值 Redis存储的用户数据,ticket生成公式:”EM_TICKET”+currentTime+userId;value就是userJson
          *  key值的生成是要遵循业务逻辑的,一般是前缀+业务逻辑值
          *  EM_TICKET 前缀 currentTime:每次登录即使是同一个
          *  用户,ticket值也不一样 userId表示每个用户身份
          *存储redis 返回ticket
          */
         Jedis jedis=new Jedis("10.9.39.13",6379);
         try{
             user.setUserPassword(
                 MD5Util.md5(user.getUserPassword()));
             User existUser=userMapper.queryExist(user);//password userName
             if(existUser==null){
                 //登录校验失败
                 return "";
             }else{//登录成功
                 //value数据 userJson的字符串
                 String userJson=
                 MapperUtil.MP.writeValueAsString(existUser);
                 //key 
                 String ticket="EM_TICKET"+
                 System.currentTimeMillis()+
                 existUser.getUserId();
                 
                 jedis.setex(ticket, 60*3, userJson);
                 //set ticket userJson EX 180
                 //成功后将ticket反悔
                 return ticket;
             }
         }catch(Exception e){
             //出现任何异常,登录以失败处理
             return "";
         }finally{
             //将jedis关闭
             jedis.close();
         }
     }
     public String queryUserJson(String ticket) {
         Jedis jedis=new Jedis("10.9.39.13",6379);
         try{
             return jedis.get(ticket);
         }catch(Exception e){
             e.printStackTrace();
             return null;
         }finally{
             jedis.close();
         }
     }
 }
cn.wiscom.user.mapper
UserMapper.java
package cn.wiscom.user.mapper;
 ​
 public interface UserMapper {
 ​
     int checkUsername(String userName);
 ​
     void saveUser(User user);
 ​
     User queryExist(User user);
 ​
 }

 

 

posted @ 2021-03-12 16:14  minnersun  阅读(113)  评论(0编辑  收藏  举报