分享在学习过程中体会到的编程思想
最近在学习springboot的一个秒杀项目。那个老师讲的一个思想我印象特别深,这里就直奔主题了。
大家都知道,我们平常如果练习ssm或者springboot框架,大部分目的是纯粹为了把项目搭建起来并且能够运行和在页面上展现数据。但是我们往往忽略了一个很重要的事情,就是数据的传输和安全性。
举个例子,这里列出一个表user_info再来一张表user_password(主要存储password用)
想一想,假设我们的分层就是domain,dao,service,controller层,并假设你的对象是User user。那么回忆一下,你是否**将这个user始终贯穿在整个项目中呢?**说白了,你在dao层,service层,controller层上的user对象的属性可能是一模一样的。
举个例子:用springboot
实现一个简单的用户登录操作。那么你竟然要登录,是不是要获得用户的用户名和密码呢?那你登录了以后,是不要展现用户的其他信息?比如用户地址,电话号码等等。那么问题来了:即使你页面只想展现除了用户重要信息意外的数据,那么你代码里面的user对象,是不是依旧有password这一类的重要信息?那么是不是有一些黑客可以从你的url根据你传的Id进行信息盗取?(无论他们是否能够实现,这整个代码框架就很危险,让用户的重要信息暴露了)。那么如何解决?实现主体类的一个分离
比如说domain层:
在dao层我们可以分别获取user_info和user_password两张表的信息
那么在service我们将它拼接在一起,形成一个新的实体类对象
而我们的service调用的对象是userModel,其中包含了最底层两个实体类的信息。具体操作:
private UserModel convertFromDataObject(UserDO userDO, UserPasswordDO userPasswordDO){
if(userDO==null){
return null;
}
UserModel userModel = new UserModel();
BeanUtils.copyProperties(userDO,userModel);
if(userPasswordDO!=null){
userModel.setEncrptPassword(userPasswordDO.getEncrptPassword());
}
return userModel;
}
那么在controller层:
假设我们已经登录完了,要开始展示信息了,那么为了彻底保证数据的安全性,我们可以这样
这个viewobject下面放的对象是用来视图(也就是web页面)上进行渲染的。
这里是UserVO,他只存储了一些基础的信息,不包含用户的密码。
那么我们Controller类就直接对他进行调用即可。同样,属性的赋值可以使用BeanUtils.copyProperties
文章写得可能有点杂,总的意思就是说不要整个项目都使用同一个对象
(这里的同一个指的是对象包含的属性都是一样的)
可以在各个层根据业务的需要适当的进行分类,就好像本文里的一样:
service:我需要密码及其基本信息相对应,那么我需要构造一个实体类,包含所有信息
controller:我需要在web页面显示用户的信息(除password之外,或者一些用于判断的权限信息等等),那么我就构造一个实体类,纯粹用于页面渲染。
写这个文章的目的,也就是希望大家以后进公司实习也好工作也好,有这个意识,多留个心眼,不然或许会造成一定的数据泄露(无论是否可能),对公司造成利益上的损失。
上一篇: Java实现飞机大战游戏思路
下一篇: 扫雷