login功能在业务层的一个小细节---减少数据的传输体量




service层的Impl代码:login()

    @Override
    public User login(String username, String password) {

        //1.先判断数据库中有没有该用户名
        User user = userMapper.getUserByName(username);
        if (user==null){
            throw new UserNotFoundException("用户名不存在!");
        }
        //2.判断该用户是否已注销isDelete=1则已经注销
        if (user.getIsDelete()==1){
            throw new UserNotFoundException("该用户已注销!");
        }
        //3.判断用户名密码是否正确
        String password1 = user.getPassword();//先获取数据库中加密过的密码
        String salt = user.getSalt();//从数据库中获取该用户的盐值
        String md5Password = getMD5Password(password, salt);
        //对比用户输入的密码加密后和数据库中的密码是否一样
        if (!md5Password.equals(password1)){
            throw new PasswordNotMatchException("密码输入错误!");
        }

        //当前的用户数据不用全部返回,返回的数据是为了辅助其他也米娜做数据展示的作用。
        //因此只需要返回的一个只包含uid、username、avatar的新user1对象中
        User user1 = new User();
        user1.setUid(user.getUid());
        user1.setUsername(user.getUsername());
        user1.setAvatar(user.getAvatar());//头像信息
        return user1;

    }


这样做的好处是:使得数据的传输体量变小了,传输体量越小性能越高。


controller里将返回的user传给前端的代码:

    @RequestMapping("/login")
    public JsonResult<User> login(String username,String password){
        User data = userService.login(username, password);
        return new JsonResult<User>(OK,data);
    }

改进:

    @RequestMapping("/login")
    public JsonResult<User> login(String username, String password, HttpSession httpSession){
        User data = userService.login(username, password);
        httpSession.setAttribute("uid",data.getUid());
        httpSession.setAttribute("username",data.getUsername());
        return new JsonResult<User>(OK,data);
    }




另外补充


状态管理:可以将数据保存在cookie或者session中,可以避免重复度很高的数据

session:用户id、用户名

cookie:用户头像


session是保存在服务器中的,更加安全,但是如果在高并发情况下,用户群体多的话,服务器压力很大。(适合用户群体少的后台管理系统)

cookie是保存在浏览器端,京东、淘宝等大型网站都是讲用户信息保存在cookie中,虽然不安全,但是我们可以对信息加密或者将涉及隐私的信息不保存到cookie,不存在服务器压力。(适合用户群体大的互联网系统)


参考链接:https://blog.csdn.net/qq_38775392/article/details/104335738






另外一个例子:


AddressServiceImpl:

    @Override
    public List<Address> getByUid(Integer uid) {
        List<Address> list = addressMapper.findByUid(uid);
        for (Address address:list){
            address.setUid(null);
            address.setProvinceCode(null);
            address.setCityCode(null);
            address.setAreaCode(null);
            address.setCreatedUser(null);
            address.setCreatedTime(null);
            address.setModifiedUser(null);
            address.setModifiedTime(null);
        }

        System.out.println(list);
        return list;
    }
  • 这里是返回用户的收获地址信息,有多条信息,因此村在一个list里面。

  • 这里的增强for循环语句,是为了将里面的每一条地址信息没用的字段置空,从而节省数据的传输体量。

  • 那么这时候有一个疑问:

问:增强for循环里for(String a : arrayList)里面的arrayList的每一条赋给a,接着对a进行操作,那么会不会只改变了a的值,而不改变原来list里面的值呢?

答:可以用System.out.println(list)语句测试以下发现,list里面对应的字段是被置空了,因此这样的写法可行。(这里只了解了用法,具体原理还未深究,等空了再去深入了解)





posted @   卡卡发  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示