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

网站意识形态建设长春地图

网站意识形态建设,长春地图,张家港江阴网站制作,页面设计英文黑马先是总结了从session实现登录,然后是因为如果使用了集群方式的服务器的话,存在集群共享session互相拷贝效率低下的问题,接着引出了速度更快的内存型的kv数据库Redis, 使用Session发送验证码和登录login 举个例子&#xff1a…

黑马先是总结了从session实现登录,然后是因为如果使用了集群方式的服务器的话,存在集群共享session互相拷贝效率低下的问题,接着引出了速度更快的内存型的kv数据库Redis,

使用Session发送验证码和登录login

举个例子:
原来的发送验证码和登录的例子,直接在session中存验证码6

    @Overridepublic Result sendCode(String phone, HttpSession session) {if(RegexUtils.isPhoneInvalid(phone)){return Result.fail("手机号格式错误");}//我这里瞎勾八写的验证码是6,图省事session.setAttribute("code","6");return Result.ok();}

从session中获取验证码,然后与从表单输入的验证码相比较,如果一致,那么就是验证码正确,query()方法是查询tb_user中的用户,利用phone字段查询用户,然后如果查询出来用户那么就利用这个电话字段创建用户user对象,如果没查出来,就自动创建新的用户,然后存在UserHolder里面,UserHolder是用静态ThreadLocal存储的User对象。

    @Override public Result login(LoginFormDTO loginFormDTO, HttpSession session) {String phone = loginFormDTO.getPhone();if(RegexUtils.isPhoneInvalid(phone)){return Result.fail("手机号格式错误");}String code = (String) session.getAttribute("code");if(code == null || !code.equals("6")){return Result.fail("验证码错误");}User user = query().eq("phone", phone).one();if(user == null){user = createUser(phone);}session.setAttribute("user",user);UserHolder.saveUser(user);return Result.ok();}

接着如果登录的话,前端界面用户的界面是访问/user/me来返回用户信息,注意这里的me函数一定要返回user,否则黑马点评的界面会又再次跳转到登录界面,非常✓8。黑马点评项目登录有好几次都是因为这个UserHolder的UserDTO为空导致又跳转到登录界面,非常✓8。

    @GetMapping("/me")public Result me(){// TODO 获取当前登录的用户并返回UserDTO user = UserHolder.getUser();log.debug("me:{}", user);return Result.ok(user);}

使用Redis存储验证码和Redis的token登录

UserServicelmpl.java,注意,我们使用Redis返回token的时候,Key是token,存储的是UserMap,UserMap是存储了UserDTO信息的,UserDTO存储了用户信息,包括他的phone,因此,token是和电话号码存在一一对应关系的!!我们后续拦截器拦截的时候,获取了Token之后,利用获取到的Token去Redis里面查询的时候就知道是哪个用户了!!!

@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Resource private StringRedisTemplate stringRedisTemplate;@Overridepublic Result sendCode(String phone, HttpSession session) {if(RegexUtils.isPhoneInvalid(phone)){return Result.fail("手机号格式错误");}//使用了Redis存储验证码,Key是LOGIN_CODE_KEY,value是6stringRedisTemplate.opsForValue().set(RedisConstants.LOGIN_CODE_KEY,"6",RedisConstants.LOGIN_CODE_TTL,TimeUnit.MINUTES);log.debug("发送验证码成功");return Result.ok();}@Override public Result login(LoginFormDTO loginFormDTO, HttpSession session) {String phone = loginFormDTO.getPhone();if(RegexUtils.isPhoneInvalid(phone)){return Result.fail("手机号格式错误");}//从内存式的Redis数据库中获取验证码,Key是LOGIN_CODE_KEY,value是6String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY );String code = loginFormDTO.getCode();if(code == null || !code.equals(cacheCode)){return Result.fail("验证码错误");}User user = query().eq("phone", phone).one();if(user == null){user = createUser(phone);}String token = UUID.randomUUID().toString(true);//不存储User,只存储UserDTO,减轻存储压力,避免存储敏感信息UserDTO userDTO= BeanUtil.copyProperties(user,UserDTO.class);//把UserDTO信息转化为HashMapMap<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));String tokenKey = LOGIN_USER_KEY + token;//把登录的这个用户以hashMap方式存储到Redis之中,token为Key,取出来的Value才是UserDTOstringRedisTemplate.opsForHash().putAll(tokenKey,userMap);//设置用户的登录过期时间,防止Redis存储太多用户信息导致内存占用很多stringRedisTemplate.expire(tokenKey,LOGIN_USER_TTL,TimeUnit.MINUTES);UserHolder.saveUser(userDTO);
//        返回tokenreturn Result.ok(token);}private User createUser(String phone) {User user = new User();user.setPhone(phone);user.setNickName("user"+ RandomUtil.randomString(10));return user;}
}

拦截器设置:

拦截器前端

在这里插入图片描述

拦截器后端

LoginInterceptor.java
UserServicelmpl.java的@Override public Result login(LoginFormDTO loginFormDTO, HttpSession session)函数return Result.ok(token);直接返回了token到前端界面,前端界面再把这个token存储到请求头的’authorization’里面。

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public LoginInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}@Override // 拦截请求public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("authorization");//根据authorization获取tokenif (StrUtil.isBlank(token)) {response.setStatus(401);return false;}//根据token从Redis里面获取UserMapMap<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(LOGIN_USER_KEY + token);//把UserMap从HashMap形式转化为Java Bean。UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//存储到UserHolder的ThreadLocal里面UserHolder.saveUser(userDTO);//刷新过期时间stringRedisTemplate.expire(LOGIN_USER_KEY + token, RedisConstants.LOGIN_USER_TTL, TimeUnit.MINUTES);// 放行return true;}@Override // 拦截响应public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用户UserHolder.removeUser();}
}
http://www.yayakq.cn/news/409667/

相关文章:

  • 做网站就是做服务今天广州新增确诊最新消息
  • 深圳工厂网站建设公司网站设计色彩搭配
  • 如何购买一个网站的域名农家乐网站规划与建设方案
  • 哪个网站做图找图片大型门户网站建设服务
  • 苏州做手机网站建设一站式服务网站
  • wordpress建材主题陕西seo推广
  • 西安php网站建设专家如何打开建设网站后台
  • 中建铁路建设有限公司网站制作一个动态企业网站
  • 可以用来做简单的网络验证的网站wordpress2016免费主题
  • 大型网站建设机构哪家好如何查网站死链
  • 做网站推广前途网站js修改代码
  • 有自己域名如何做网站做购物网站流程
  • 台州网站建设平台深圳网络推广课程
  • 搭建钓鱼网站教程浙江省建设银行纪检官方网站
  • 做公司网站需要什么材料在上海做兼职在哪个网站
  • 西红柿怎么做网站wordpress 聘用
  • 公主岭网站开发北京到广州
  • 购买网站空间送域名做外贸有什么免费网站
  • 在线购物网站怎么做网站开发与维护 专业
  • 中小型网站建设与管理设计总结手机系统优化软件哪个好
  • 网站管理助手+建设中怎么做直播网站的超管
  • 手机网站开发语言个性flash网站
  • 深圳网站建设需要多少钱吕邵苍设计公司网站
  • 崇州网站制作网站开发模块学些什么
  • 郑州手机网站一级a行做爰片免费网站
  • 做网站公司没签合同设计工作室网站首页
  • 自己建设一个网站需要多少钱岳阳建设网站哪家好
  • 做网站找华企wordpress php 5.2
  • 网站建设丿金手指15科技广告公司网站模板
  • 西安网站建设网站建设深圳专业网络推广