当前位置: 首页 > news >正文

东莞网站建设网站推广价钱seo推广优化外包公司

东莞网站建设网站推广价钱,seo推广优化外包公司,t型布局网站怎么做,凡科网做网站要钱吗Redis代替session 实现登录流程 如果使用String,他的value,用多占用一点空间,如果使用哈希,则他的value中只会存储他数据本身,如果不是特别在意内存,其实使用String就可以 设计key的具体细节 在设计这个k…

Redis代替session 实现登录流程

        如果使用String,他的value,用多占用一点空间,如果使用哈希,则他的value中只会存储他数据本身,如果不是特别在意内存,其实使用String就可以

设计key的具体细节

在设计这个key的时候,我们之前讲过需要满足两点

  1. key要具有唯一性
  2. key要方便携带

        如果我们采用phone:手机号这个的数据来存储当然是可以的,但是如果把这样的敏感数据存储到redis中并且从页面中带过来毕竟不太合适,所以我们在后台生成一个随机串token,然后让前端带来这个token就能完成我们的整体逻辑了

整体访问流程

        当注册完成后,用户去登录会去校验用户提交的手机号和验证码,是否一致,如果一致,则根据手机号查询用户信息,不存在则新建,最后将用户数据保存到redis,并且生成token作为redis的key,当我们校验用户是否登录时,会去携带着token进行访问,从redis中取出token对应的value,判断是否存在这个数据,如果没有则拦截,如果存在则将其保存到threadLocal中,并且放行。

基于Redis实现短信登录

UserServiceImpl代码


//    public static final String LOGIN_CODE_KEY = "login:code:";
@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {// 1.校验手机号String phone = loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合,返回错误信息return Result.fail("手机号格式错误!");}// 3.从redis获取验证码并校验String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);String code = loginForm.getCode();if (cacheCode == null || !cacheCode.equals(code)) {// 不一致,报错return Result.fail("验证码错误");}// 4.一致,根据手机号查询用户 select * from tb_user where phone = ?User user = query().eq("phone", phone).one();// 5.判断用户是否存在if (user == null) {// 6.不存在,创建新用户并保存user = createUserWithPhone(phone);}// 7.保存用户信息到 redis中// 7.1.随机生成token,作为登录令牌String token = UUID.randomUUID().toString(true);// 7.2.将User对象转为HashMap存储UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));// 7.3.存储String tokenKey = LOGIN_USER_KEY + token;stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);// 7.4.设置token有效期stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);// 8.返回tokenreturn Result.ok(token);
}

解决状态登录刷新问题

        在这个方案中,他确实可以使用对应路径的拦截,同时刷新登录token令牌的存活时间,但是现在这个拦截器他只是拦截需要被拦截的路径,假设当前用户访问了一些不需要拦截的路径,那么这个拦截器就不会生效,所以此时令牌刷新的动作实际上就不会执行,所以这个方案他是存在问题的

        既然之前的拦截器无法对不需要拦截的路径生效,那么我们可以添加一个拦截器,在第一个拦截器中拦截所有的路径,把第二个拦截器做的事情放入到第一个拦截器中,同时刷新令牌,因为第一个拦截器有了threadLocal的数据,所以此时第二个拦截器只需要判断拦截器中的user对象是否存在即可,完成整体刷新功能。

RefreshTokenInterceptor

public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.获取请求头中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {return true;}// 2.基于TOKEN获取redis中的用户String key  = LOGIN_USER_KEY + token;Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);// 3.判断用户是否存在if (userMap.isEmpty()) {return true;}// 5.将查询到的hash数据转为UserDTOUserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);// 6.存在,保存用户信息到 ThreadLocalUserHolder.saveUser(userDTO);// 7.刷新token有效期stringRedisTemplate.expire(key, LOGIN_USER_TTL, TimeUnit.MINUTES);// 8.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用户UserHolder.removeUser();}
}

LoginInterceptor

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.判断是否需要拦截(ThreadLocal中是否有用户)if (UserHolder.getUser() == null) {// 没有,需要拦截,设置状态码response.setStatus(401);// 拦截return false;}// 有用户,则放行return true;}
}

http://www.yidumall.com/news/45132.html

相关文章:

  • 怎么做网站里的悬浮窗口百度爱采购推广效果怎么样?
  • 购物网站建设免费个人网站申请
  • 网站标准尺寸石家庄疫情最新情况
  • 广东专业网站客服软件定制今天的新闻主要内容
  • 做系统和做网站哪个简单一些推广赚钱的软件
  • no.7极简wordpress博客主题深圳seo专家
  • 民权做网站哪家好企业网站制作要求
  • 九龙坡网站建设最好的小说网站排名
  • 香山网站建设广州网站优化多少钱
  • 一般做网站奉化网站关键词优化费用
  • 做的最好的相亲网站有哪些51网站统计
  • 廉洁 网站建设成都网站改版优化
  • 建应用网站搜索排名广告营销怎么做
  • html5+css3网站模板网络营销专业是干嘛的
  • 专业做曝光引流网站网络推广外包代理
  • 网站搜索优化价格免费注册推广网站
  • 长春做网站哪家好网站seo专员
  • 电子商务网站开发人员搜索引擎优化通常要注意的问题有
  • 做电商要关注哪些网站在线网站分析工具
  • 买的服务器做两个网站网站设计报价方案
  • 新手怎么做详情页搜索关键词优化排名
  • 南京专业做网站的公司有哪些怎么申请自己的域名
  • 浙江立鹏建设有限公司网站百度服务中心人工24小时电话
  • 房地产市场信息系统网站广州seo做得比较好的公司
  • 网站关键词排行查询seo排名计费系统
  • 招聘网站策划书西安关键词seo
  • 广州seo网站开发万网域名查询注册商
  • 网站策划与制作seo超级外链工具免费
  • 在洪雅网站做企业招聘下载百度官方网站
  • 江门公司网站制作自己怎么开网站