2021

昨天,有网友在群里说在GitHub上发现了色情网站! GitHub上怎么会有色情网站呢?网友给出了下面的截图: 这个出现在Go标准库中的Issue里面,有一个url… 该Issue地址:https://github.com/golang/go/issues/48886 DD小心翼翼的复制到浏览器,打开…不可描述的画面出现了… 这个事情传开后,也引来了一些中国开发者的围观: 也有群友表示,这网站中文的,肯定是中国人提交的,真给国人丢脸… 谁提交了这段代码?那么到底是谁提交了这段代码呢? 从issue中,我们可以看到这个url出现在这个文件中:go/src/sync/example_test.go 可惜点开“History”,并没发现相关的提交信息: 仔细看提交时间!居然这个黄色站点的URL在7年前就被植入了! 继续翻看历史,DD找到了10年前的代码: 点开它,惊人的一幕...

接上一篇IDEA调试技巧远程调试 5. 临时执行表达式/修改变量的运行值调试时,可以临时执行一些表达式,参考下图:点击这二个图标中的任何1个都可以 点击+号后,就可以在新出现的输入框里输入表达式,比如:i+5 然后回车,马上就能看到结果 当然,如果调试时,想动态修改变量的值,也很容易,在变量上右击,然后选择Set Value,剩下的事,地球人都知道。 好了,今天的文章就到这里了,牢记这5大调试技巧可以让你快速定位问题,迅速解决bug,最后祝大家debug愉快!

接上一篇IDEA调试技巧多线程调试 4.远程调试这也是一个装B的利器,本机不用启动项目,只要有源代码,可以在本机直接远程调试服务器上的代码,打开姿势如下: 4.1 项目启动时,先允许远程调试java -server -Xms512m -Xmx512m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9081 -Djava.ext.dirs=. ${main_class} 起作用的就是: -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9081 注意:远程调试从技术上讲,就是在本机与...

接上一篇IDEA调试技巧回到’上一步’ 3.多线程调试多线程同时运行时,谁先执行,谁后执行,完全是看CPU心情的,无法控制先后,运行时可能没什么问题,但是调试时就比较麻烦了,最明显的就是断点乱跳,一会儿停这个线程,一会儿停在另一个线程,比如下图: 如果想希望下一个断点位置是第2句诗句,可能要失望了: 如果想让线程在调试时,想按自己的愿意来,让它停在哪个线程就停在哪个线程,可以在图中3个断点的小红点上右击, 即:Suspend挂起的条件是按每个线程来,而非All。把这3个断点都这么设置后,再来一发试试 注意上图中的红框位置,断点停下来时,这个下拉框可以看到各个线程(注:给线程起个容易识别的名字是个好习惯!),我们可以选择线程“天空中的飞鸟”。 断点如愿停在了第2句诗。 点击查看下一个IDEA调试技巧远程调试

接上一篇IDEA调试技巧回到’上一步’ 回到”上一步”该技巧最适合特别复杂的方法套方法的场景,好不容易跑起来,一不小心手一抖,断点过去了,想回过头看看刚才的变量值,如果不知道该技巧,只能再跑一遍。 参考上图,method1方法调用method2,当前断点的位置j=100,点击上图红色箭头位置的Drop Frame图标后,时间穿越了 回到了method1刚开始调用的时候,变量i变成了99。 注:好奇心是人类进步的阶梯,如果想知道为啥这个功能叫Drop Frame,而不是类似Back To Previous之类的,可以去翻翻JVM的书,JVM内部以栈帧为单位保存线程的运行状态,drop frame即扔掉当前运行的栈帧,这样当前“指针”的位置,就自然到了上一帧的位置。 点击查看下一个IDEA调试技巧多线程调试

在项目开发的时候我发现很多小伙伴能非常熟练的使用 IDEA 编写代码,但是对于IDEA调试的技巧掌握的不是很好,只会F7、F8、F9等这些基本调试功能。 而像一些复杂的调试场景就无从下手,如:在for循环中调试某个特定值;多线程、Reactor调试;修改变量的运行值等。 下面我们就来分场景介绍一下IDEA的调试技巧,看完掌握后调试bug的效率一定大大提升 条件断点循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值。 参考上图,在断点的位置,右击断点旁边的小红点,会出来一个界面,在Condition这里填入断点条件即可,这样调试时,就会自动停在i=10的位置。 点击查看下一个IDEA调试技巧回到’上一步’

最近有个粉丝提了个问题,说他在Spring Security中用JWT做退出登录的时无法获取当前用户,导致无法证明“我就是要退出的那个我”,业务失败!经过我一番排查找到了原因,而且这个错误包括我自己的大部分人都犯过。 Session会话之所以要说Session会话,是因为Spring Security默认配置就是有会话的,所以当你登录以后Session就会由服务端保持直到你退出登录。只要Session保持住,你的请求只要进入服务器就可以从ServletRequest中获取到当前的HttpSession,然后会根据HttpSession来加载当前的SecurityContext。相关的逻辑在Spring Security默认的过滤器SecurityContextPersistenceFilter中,有兴趣可以看相关的源码。 而且默认情况下SecurityContextPersisten...

Spring Cloud 2021.0.0-M2 已发布,代号”Jubilee”,可从 Spring Milestone 仓库获取新版本,相关 issue 和 PR 信息查看其 GitHub 项目页面。 另外,此版本与 Spring Boot 2.6.0-M3 兼容。 Spring Cloud Commons调整用于 Sleuth 的NamedContextFactoryAPI Spring Cloud ConfigJDBC Environment 仓库支持除 String 之外的其他类型 issue 1952 Spring Cloud Contract 支持 UUID v4,以及修复大小写敏感问题 issue 1688 使用独立的 docker 镜像时支持自定义build.gradleissue 1672 Spring Cloud Gateway支持 HTTP 2 协议 issu...

在Spring Boot项目中,可以通过@EnableScheduling注解和@Scheduled注解实现定时任务(在DD的Spring Boot教程中就有介绍:使用@Scheduled实现定时任务),也可以通过SchedulingConfigurer接口来实现定时任务。但是这两种方式不能动态添加、删除、启动、停止任务。 下面是DD在简书上看到的一篇非常不错的文章,作者jessehua,通过扩展Spring自带的定时任务,实现了定时任务的动态增删启停。如果你也有这样的需求,那么可以看看下面的内容,学习一下作者的思路。 要实现动态增删启停定时任务功能,比较广泛的做法是集成Quartz框架。但是本人的开发原则是:在满足项目需求的情况下,尽量少的依赖其它框架,避免项目过于臃肿和复杂。 查看spring-context这个jar包中org.springframework.scheduli...

最近几年的项目我都用JWT作为身份验证令牌。我一直有一个疑问:服务端发放给浏览器的JWT到底应该存储在哪里?这里只讨论浏览器的场景,在这个场景里有三种选择。 Cookie服务端可以将JWT令牌通过Cookie发给浏览器,浏览器在请求服务端接口时会自动在Cookie头中带上JWT令牌,服务端对Cookie头中的JWT令牌进行检验即可实现身份验证。但它容易受到CSRF攻击的影响。 解决的方法是通过设置Cookie的SameSite属性为Strict。跨站时不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。 Cookie除了易受CSRF攻击还有XSS攻击。黑客可以通过JS脚本读取Cookie中的信息。为了防止这一点,可以设置Cookie的属性为HttpOnly。 response.setHeader("Set-Cookie", "jwt=jwt...

在本站看完了DD的Spring Boot教程之后,是不是很想再来一个更贴近实战项目学习一下? 今天TJ就顺手给大家推荐一个不错的前后端分离项目,该项目是一个采用SpringBoot + Vue来实现的一个网页版聊天室。 读者可以通过源码学习Spring Boot更为实战的应用,如果你正在做大作业或相关的毕业设计,也可以作为基础参考。 简介聊天室使用Spring Security安全框架对于登录权限认定进行密码的加密处理,使用WebSocket+Socket.js+Stomp.js实现聊天消息的传输。 同时服务器使用FastDFS文件服务器保存聊天过程中产生的图片,再结合Vue.js与Element UI进行弹窗和数据表格分页等展示效果。 数据库方便使用MyBatis结合MySQL进行相应的开发。 前后端技术栈: 前端: Vue ElementUI axios vue-router ...

平时你画UML图都用什么?Processon、Visio这些相信大家已经都很熟悉了。今天TJ要给大家介绍的是一个特别的画图工具,它是IDEA中的一个插件,有了它你可以把画图与编码都集成到IDEA中一起完成,是不是感觉很棒呢?下面就来一起认识下今天要介绍的IDEA插件:PlantUML! PlantUML,是一款开源的图绘制项目,支持通过编写文本来快速生成各种UML图形,目前支持时序图、用例图、类图、对象图、组件图、部署图、状态图、定时图;同时也支持用来生成非UML图,像JSON数据、YAML数据、架构图、思维导图等等,都可以用它来完成。 简单的说,就是你直接通过编程来画出你要的各种图,是不是特别适合我们程序猿呢? 光说可能不够形象,直接上例子,例如像一些时序图,你就可以这样实现: 图案左半边,就是你输入的文本,右半边就是根据文本生成的效果,像这种时序图,语法规则其实很简单,可以简单...

在如今的关系型数据库中,有两个开源产品是你必须知道的。其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的。而今天我们将介绍另外一个开源关系型数据库:PostgreSQL,以及在Spring Boot中如何使用。 PostgreSQL简介在学习PostgreSQL的时候,我们总是会将其与MySQL放一起来比较:MySQL自称是最流行的开源数据库,而PostgreSQL则标榜自己是最先进的开源数据库,那么有多先进呢?下面就一起认识一下它! PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。Postg...

Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一。今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11。 字符串API增强在Java 11中,针对String的操作进一步得到加强。避免我们在很常见的场景中引入额外的、复杂的API。 isBlank()用来判断字符串是不是空字符""或者trim()之后(" ")为空字符: String blankStr = " ";// trueboolean trueVal = blankStr.isBlank(); lines()将一个字符串按照行终止符(换行符\n或者回车符\r)进行分割,并将分割为Stream流: String newStr = "Hello Java 11 \n felord.cn \r 2021-09...

在上一篇我们对Java 9的新特性进行了一些回顾,今天接着来看看Java 10带来了什么特性。之所以需要把Java 8 到Java 17的特性归纳一遍,因为Java社区对Java 17的重视程度前所未有。话不多说,让我们走进Java 10。 Java 10从Java 10 开始,Java的迭代周期缩短为半年,半年发布一个版本。 局部变量类型推断在Java 6时初始化一个Map需要我们这样来声明: Map<String, String> map = new HashMap<String,String>(); 事实上泛型方法的参数可以通过上下文推导出来,所以在Java 7 中简化为: Map<String, String> map = new HashMap<>(); 到了Java 10 进一步升华了类型推断,我们看一个例子: var ma...