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 |
添加redis的简化依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.7.RELEASE</version> </dependency>
?
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
?
<?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>
package cn.wiscom; ? @SpringBootApplication @EnableEurekaClient @MapperScan("cn.wiscom.user.mapper") public class StarterUserService { public static void main(String[] args) { SpringApplication.run(StarterUserService.class, args); } //在启动类中可以按照一个配置类来编写所有需要的配置内容 }
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); } } }
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(); } } }
package cn.wiscom.user.mapper; ? public interface UserMapper { ? int checkUsername(String userName); ? void saveUser(User user); ? User queryExist(User user); ? }
原文:https://www.cnblogs.com/minnersun/p/14524620.html