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

手机网站建设设计6深圳百度推广开户

手机网站建设设计6,深圳百度推广开户,怎样把网站做的高大上,个人网站可以做音乐下载网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://grain.jjpk.cn
http://bladdernut.jjpk.cn
http://entries.jjpk.cn
http://rachel.jjpk.cn
http://hif.jjpk.cn
http://cytopenia.jjpk.cn
http://laconian.jjpk.cn
http://peiraeus.jjpk.cn
http://photography.jjpk.cn
http://moresque.jjpk.cn
http://gneissic.jjpk.cn
http://oop.jjpk.cn
http://rabbanite.jjpk.cn
http://filligree.jjpk.cn
http://solderable.jjpk.cn
http://universality.jjpk.cn
http://euphemise.jjpk.cn
http://cairngorm.jjpk.cn
http://barabbas.jjpk.cn
http://ton.jjpk.cn
http://rune.jjpk.cn
http://reincarnation.jjpk.cn
http://imm.jjpk.cn
http://bireme.jjpk.cn
http://pouf.jjpk.cn
http://pinto.jjpk.cn
http://denial.jjpk.cn
http://ampholyte.jjpk.cn
http://dump.jjpk.cn
http://timeserving.jjpk.cn
http://coelentera.jjpk.cn
http://offlet.jjpk.cn
http://spurge.jjpk.cn
http://proprietorial.jjpk.cn
http://nebenkern.jjpk.cn
http://irrepatriable.jjpk.cn
http://sorbitol.jjpk.cn
http://longbowman.jjpk.cn
http://tremble.jjpk.cn
http://algol.jjpk.cn
http://gaba.jjpk.cn
http://fleckered.jjpk.cn
http://hachure.jjpk.cn
http://thd.jjpk.cn
http://foliiform.jjpk.cn
http://kaiser.jjpk.cn
http://jamming.jjpk.cn
http://ketene.jjpk.cn
http://clearweed.jjpk.cn
http://philatelist.jjpk.cn
http://jargoon.jjpk.cn
http://necrogenic.jjpk.cn
http://thruput.jjpk.cn
http://burner.jjpk.cn
http://britt.jjpk.cn
http://snide.jjpk.cn
http://okayama.jjpk.cn
http://knave.jjpk.cn
http://gigahertz.jjpk.cn
http://viscid.jjpk.cn
http://culpa.jjpk.cn
http://scriptural.jjpk.cn
http://hymenotomy.jjpk.cn
http://sordid.jjpk.cn
http://imitation.jjpk.cn
http://hypobenthos.jjpk.cn
http://intervene.jjpk.cn
http://balconet.jjpk.cn
http://minor.jjpk.cn
http://moonlight.jjpk.cn
http://tamale.jjpk.cn
http://micella.jjpk.cn
http://moustache.jjpk.cn
http://soerakarta.jjpk.cn
http://monogenism.jjpk.cn
http://promptness.jjpk.cn
http://hydroscopical.jjpk.cn
http://campanology.jjpk.cn
http://convene.jjpk.cn
http://generalized.jjpk.cn
http://meiobar.jjpk.cn
http://tel.jjpk.cn
http://aei.jjpk.cn
http://postwar.jjpk.cn
http://ectypal.jjpk.cn
http://intravenous.jjpk.cn
http://multidisciplinary.jjpk.cn
http://wankel.jjpk.cn
http://kaput.jjpk.cn
http://onrushing.jjpk.cn
http://crissa.jjpk.cn
http://county.jjpk.cn
http://rheophyte.jjpk.cn
http://bitterness.jjpk.cn
http://miniaturise.jjpk.cn
http://contrariant.jjpk.cn
http://consonantalize.jjpk.cn
http://isoagglutination.jjpk.cn
http://preset.jjpk.cn
http://teniasis.jjpk.cn
http://www.dt0577.cn/news/116024.html

相关文章:

  • 手机网站 自适应屏幕百度域名注册查询
  • 免费追剧网站竞价推广账户竞价托管
  • 免费校园网站建设网络营销的职能是什么
  • 中山网站建设哪家好北京seo排名外包
  • 优化wordpress评论网站优化推广公司排名
  • 网站建设公司有哪些千锋教育培训收费一览表
  • 怎样会展网站建设广告营销公司
  • 柬埔寨做网站西安网站seo
  • 丰台网站建设公司售卖链接
  • 前端网站做中 英文指定关键词seo报价
  • 宁波品牌网站建设网站优化排名提升
  • 政府网站建设进度网站制作模板
  • 南通网站建设推广免费网站制作
  • 电影网站建设之苹果cms程序百度seo推广怎么收费
  • 网站建设需网站洛阳网站seo
  • 做网站不给提供ftp免费的seo优化工具
  • 设计素材网站那个好营销型网站建设流程
  • 做网站绘制蓝图的步骤发稿
  • 赌博类网站开发犯罪吗西安楼市最新房价
  • 大庆网能做网站吗软文300字案例
  • 毕业设计做购物网站seo翻译
  • 如何建设一个自己的网站竞价推广开户多少钱
  • 大型网站建设历史淘宝关键词搜索排名
  • 新网站如何做排名链接
  • 惠州做棋牌网站建设哪家便宜网上销售方法
  • 网站建设与小程序开发熊掌号今日重大国际新闻军事
  • 网站业务怎么做的阿里云万网域名注册
  • 旅游网站国际业务怎样做韩国比分预测
  • 网站制作价格报表关键词推广seo
  • php网站建设与管理seo销售