1、为什么使用单点登录?
以前实现登录注册是在同一个tomcat内部完成,我们现在的系统框架是每一个系统由一个团队进行维护,每个系统都单独部署一个tomcat,不能将用户的登录信息保存到session中(多个tomcat的session不能共享),所以我们需要一个单独的系统来维护用户的登录信息。
由上图可看出:
- 客户端需要需要通过SSO系统才能获取到token;
- 客户端请求服务系统时,服务系统需要对sso系统进行token验证;
- sso系统在整个系统架构中处于核心位置;
2、Linux常用命令
rm -rf 文件名 ------------ 删除文件(包含多个子文件)
ps aux ------------查询所有进程
ps aux | grep 进程名 --------------查询指定进程的状态
wget 下载url --------------下载文件
快速定位文件中的某一行
:n -----n 为具体的某一行
3、Spring 中@Configuration 和 @Component 区别?
一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。
@Component和@Configuration作为配置类的差别
4、空指针异常(新手常犯)
当查询对象为null时,要新建一个对象塞值,否则会报空指针异常
//查询判断是否为新用户
QueryWrapper<User> wrapper = new QueryWrapper<User>();
wrapper.eq("mobile", phone);
User user = userMapper.selectOne(wrapper);
//log.info(user.toString()); =====这里查询出的用户为null,所以这行日志会报空指针
Boolean isNew = true;
String data = "";
if (user == null) {
//注册新用户
user=new User(); ================少了新建对象,一直报空指针
user.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
user.setMobile(phone);
userMapper.insert(user);
}
5、序列化与反序列化
编写如下代码时,笔者有几个疑问:
public User getUserByToken(String token) {
String ssoUrl = url + "/user/" + token;
try {
String data = restTemplate.getForObject(ssoUrl, String.class);
//传输过程中默认序列化
return MAPPER.readValue(data, User.class);
} catch (JsonProcessingException e) {
log.info("校验token超时");
}
return null;
}
1)、User对象中没有实现serializable接口,未进行序列化,为何远程调用需要反序列化?
对于基本数据类型包装类,底层已经实现了Serializable接口,比如Interger、String,JVM可以识别,而如何我们自己写的对象中(Person)又包含了其他对象(Student),则需要序列化Serializable,表示该对象需要被序列化;
2)、restTemplate.getForObject里为什么不直接用User.class而是用String.class?
远程调用时(不同的ip传输),是以Json格式传输的,所以只能用String.class来接收,再反序列化转回我们原本所需的属性;
3)、针对数据安全,不想被传输的字段应该怎么做?
像用户密码,在传输过程中,我们不希望它被序列化,可以在该字段上加上@JsonIgnore,忽略序列化;
@JsonIgnore注解
作用:在json序列化时将pojo中的一些属性忽略掉,标记在属性或者方法上,返回的json数据即不包含该属性。
@Table(name = "tb_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;// 用户名
@JsonIgnore
private String password;// 密码
private String phone;// 电话
private Date created;// 创建时间
@JsonIgnore
private String salt;// 密码的盐值
//TODO add getter setters
}