项目散碎知识点总结

1、为什么使用单点登录?
以前实现登录注册是在同一个tomcat内部完成,我们现在的系统框架是每一个系统由一个团队进行维护,每个系统都单独部署一个tomcat,不能将用户的登录信息保存到session中(多个tomcat的session不能共享),所以我们需要一个单独的系统来维护用户的登录信息。
SSO在整个系统框架中的应用
由上图可看出:

  • 客户端需要需要通过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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值