经过一个多月的等待我有幸成为Spring相关项目的Contributor
给开源项目尤其是Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的。有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅。
我曾经给Spring Security提交了一个我认为非常重要的一项优化,和作者沟通了几十个来回无法说服他。人家说留了抽象接口,你觉得不对自己实现一个就是了,默认的就是能用而已,无奈我就放弃了这个PR。
想不到在Spring Authorization Server中我抓住了一个能够绝对被接受的机会,经过一个多月的等待,最终我的PR被接受了。
我在编写Spring Authorization Server相关教程中,调用授权服务器元信息端点时不小心后面带了个锚点符号#
,类似http://issuer.felord.cn/#
,报了一个请求错误,在追踪源码的时候我发现对这个url是进行过校验的,出现了这种非预期的结果说明规则一定有漏洞。于是我查阅了相关RFC的定义,找到了依据RFC8414。
这个规范的实现没有什么技术含量,我如果告诉你,你也能做得到,甚至做得比我好,所以只要实现了,PR被接受应该是跑不了的事情,甚至可以半场开香槟。在0.3.0版本中这个优化将会实装。对这个过程,我简单总结了一下分享出来 ,或许对希望参与开源贡献的你有所帮助。
代码风格
首先是代码风格,开源项目都有一些代码风格要求,我之前有很多东西模仿(抄)了Spring的设计,所以我在实现规范的时候特别注意了这一点,命名风格、缩进等等都反复推敲。
理解项目的架构思想
在整个PR过程中,我出现的问题主要在这里。虽然我最初的实现执行起来没有问题,完全在生命周期之内,但是显然它的位置不是最佳。比如参数的校验你可以写在控制层,也可以写在服务层,结果一定是没问题的,但是过程可能有问题。作者和我沟通了一番,表明了他的设计思路,很快我就纠正了这个问题。
单元测试非常重要
实现代码确实不多,单元测试的代码几乎超过了其20倍。我们平时写个main
方法简单sout
打印一下就完事了,对于开源项目可不一样。尤其是这种知名开源框架,需要你测试实现的方方面面。如果你想为开源项目贡献代码,常用的断言、Mock插桩都要会,这个胖哥的博客felord.cn都有相关的介绍。
Git规范
Git 提交规范胖哥也多次强调了它的重要性,在大型开源项目中遵循一些提交规范也是一个基本要求。一些Pull Request的规则、代码Review流程也要熟悉,这些功夫都在于平时。Git你得熟练。Spring要求最小功能提交,怎么说呢?你的实现必须是一个最小粒度的完整单元,你不能在一个提交中既有增强优化(enhance)还有新特性(feature)。而且你的提交必须压缩到一个git commit内,即使被打回去修改。要多用
git commit --amend -m '你的提交信息'
在一些不得已的时候,git rebase
和squash commits或许能帮到你。
但是千万不要去搞什么Git原理底层,把工具用熟练就够了。
要善于发现,敢做敢为
最重要的一点,你要善于发现,比如下面这个bug(现在还没有彻底修复),如果我说它是个bug,你一定会大吃一惊,我当时也是一样的。
public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List<Filter> filters) {
if (!filters.isEmpty()) {
logger.info(LogMessage.format("Will not secure %s", requestMatcher));
}
else {
logger.info(LogMessage.format("Will secure %s with %s", requestMatcher, filters));
}
this.requestMatcher = requestMatcher;
this.filters = new ArrayList<>(filters);
}
3.1版本的log逻辑居然错到5.6版本!而修复它只需要改下位置,这个bug我妈应该也会改。但是没有人发现和质疑它,直到最近有人提交了修复(5.7版本会修复这个bug)。
所以你要善于发现一些问题和细节,同时也要敢于质疑,即使质疑错了又不会损失什么。
要有专长
我和大家一样,平常也是什么都学,没办法!做原创技术博主太容易内容焦虑了。但是我刻意保证了一些东西去深入学习,有些东西必须成为你的独门绝技,要一精多专,这样你在专长的领域可能有更多的机会。
TODO
对于成为开源贡献者只是一个开始,更多的挑战还在后面。有人问我最近为什么更文少了!这里也讲一下我最近在做的事。
首先,因为疫情我被隔离在家办公了。
其次,还有几个开源贡献正在进行中。
还有,我正在做一个基于Spring Authorization Server的开源项目Id Server,你可以认为是一个极简版的keycloak,甚至最初的功能比较简陋,layui都是先学的,界面我也做不好。放个截图吧。
做这个东西很有挑战,前端真是太难了!目前已经初具雏形,不日将放出预览版,也欢迎各位同学参与贡献。
关注公众号:Felordcn 获取更多资讯
经过一个多月的等待我有幸成为Spring相关项目的Contributor的更多相关文章
- 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...
- 09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider
1. 编写ContentPrivider提供者的Android应用 清单文件 <?xml version="1.0" encoding="utf-8"? ...
- 使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development、production)
使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development.production) --mode 指定环境模式 ...
- Oracle中的自连接(self join)-当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自连接。
http://blog.163.com/wkyuyang_001/blog/static/10802122820091751049479/ 当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自 ...
- 一个电商项目的Web服务化改造
一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...
- SAP MM 一个含有多个账号分配对象的行项目的PO及其收货
SAP MM 一个含有多个账号分配对象的行项目的PO及其收货 如下的采购订单,一个行项目数量为8PC,分别对应8个固定资产号, 在该ITEM的科目分配里,按数量做了拆分,每个数量对应一个固定资产号.如 ...
- Bug2020011601,在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现
在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现. 加上少的双引号,解决了.
- 封闭的一个多月,老菜鸟的 机械手和AGV 自动搬运小项目总结
最近上海疫情严重,闲赋在家无事可做,手机里不断的推送一些无脑的谩骂声音,索性找点事情做,将3月份实施的一个自动搬运小项目做一个简单的汇总,便于今后项目实施中积累一些经验.项目需求非常简单,因为能力有限 ...
- C#中判断一个数组中是否存在某个数组值 及相关
声明:reference:http://www.cnblogs.com/icebutterfly/archive/2010/06/22/1762738.html:http://blog.csdn.ne ...
随机推荐
- WeakHashMap 是怎么工作的?
WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收.
- java的arrays
java.util.Arrays 是一个于数组相关的工具类,里面提供大佬的静态方法,用来实现数组常见的操作 public staic String toString(数组) 将参数数组编程字符串,默 ...
- 什么是多线程环境下的伪共享(false sharing)?
伪共享是多线程系统(每个处理器有自己的局部缓存)中一个众所周知的性能问 题.伪共享发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行,如 下图所示: 伪共享问题很难被发现,因为线程可能访问完全不 ...
- 学习Nginx(三)
nginx的性能测试及常用优化手段 一.nginx的性能测试及对比 1.环境准备 [root@test8_hadoop_kaf ~]# yum install -y httpd-tools [ro ...
- Effective Java —— 用私有构造器或枚举类型强化单例属性
本文参考 本篇文章参考自<Effective Java>第三版第三条"Enforce the singleton property with a private construc ...
- Clickhouse 用户自定义外部函数
写在前面 Clickhouse 从 21.11 版本开始,除了提供类似SqlServer.MySQL CREATE FUNCTION 的自定义函数之外,还有一个用户自定义函数(UDF),与其说是&qu ...
- jsp页面学习之"javascript:void(0)"的使用
javascript:void(0) 仅仅表示一个死链接 如果是个# javascript:void(#),就会出现跳到顶部的情况,搜集了一下解决方法 1:<a href="####& ...
- SCTF 2018_Simple PHP Web
SCTF 2018_Simple PHP Web 进入环境注意观察url http://www.bmzclub.cn:23627/?f=login.php 有点像是文件读取我们尝试读一下/etc/pa ...
- 当心,你搞的Scrum可能是小瀑布
摘要:有的团队刚接触Scrum,一个问题令他们很困扰:迭代初期开发人员的工作较多,测试人员闲着:迭代末期开发人员闲着,测试人员的工作比较多,怎么解决资源等待的问题呢? 本文分享自华为云社区<当心 ...
- Android M 版本以后的特殊权限问题分析
现象 桌面悬浮框在6.0以后,会因为SYSTEM_ALERT_WINDOW权限的问题,无法在最上层显示. 问题原因 SYSTEM_ALERT_WINDOW,设置悬浮窗,进行一些黑科技 WRITE_SE ...