<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title>竹溪的小窝</title><link>http://riverlin-code.site</link><atom:link href="http://riverlin-code.site/rss.xml" rel="self" type="application/rss+xml"/><description>竹溪的小窝</description><generator>Halo v2.25.4</generator><language>zh-cn</language><lastBuildDate>Thu, 23 Jul 2026 19:15:29 GMT</lastBuildDate><item><title><![CDATA[别把文件上传写成一个 `save`：可靠上传接口的设计与实现]]></title><link>http://riverlin-code.site/archives/wei-ming-ming-wen-zhang-Pf29ekVV</link><description><![CDATA[<img src="http://riverlin-code.site/plugins/feed/assets/telemetry.gif?title=%E5%88%AB%E6%8A%8A%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%86%99%E6%88%90%E4%B8%80%E4%B8%AA%20%60save%60%EF%BC%9A%E5%8F%AF%E9%9D%A0%E4%B8%8A%E4%BC%A0%E6%8E%A5%E5%8F%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0&amp;url=/archives/wei-ming-ming-wen-zhang-Pf29ekVV" width="1" height="1" alt="" style="opacity:0;">别把文件上传写成一个 save：可靠上传接口的设计与实现 开发中的痛点 在头像、附件、合同、简历等业务中，文件上传接口看起来并不复杂：接收 MultipartFile，把文件写入对象存储，再保存一条数据库记录。 最直接的实现通常是： @Transactional public Long upload]]></description><guid isPermaLink="false">/archives/wei-ming-ming-wen-zhang-Pf29ekVV</guid><dc:creator>竹溪</dc:creator><category>架构</category><pubDate>Wed, 22 Jul 2026 09:39:18 GMT</pubDate></item><item><title><![CDATA[Challenge 机制详解：从身份验证到一次性操作授权]]></title><link>http://riverlin-code.site/archives/wei-ming-ming-wen-zhang-e6Tu4Oa1</link><description><![CDATA[<img src="http://riverlin-code.site/plugins/feed/assets/telemetry.gif?title=Challenge%20%E6%9C%BA%E5%88%B6%E8%AF%A6%E8%A7%A3%EF%BC%9A%E4%BB%8E%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%88%B0%E4%B8%80%E6%AC%A1%E6%80%A7%E6%93%8D%E4%BD%9C%E6%8E%88%E6%9D%83&amp;url=/archives/wei-ming-ming-wen-zhang-e6Tu4Oa1" width="1" height="1" alt="" style="opacity:0;">Challenge 机制详解：从身份验证到一次性操作授权 敏感操作真正需要的，不只是“验证码正确”，而是确认：哪个用户，正在对哪个资源，执行哪一种操作，并且这次确认只能使用一次。 Challenge 就是承载这段验证上下文和状态变化的一次性任务。 开发中的痛点 假设系统准备实现“注销账号”。最直接的]]></description><guid isPermaLink="false">/archives/wei-ming-ming-wen-zhang-e6Tu4Oa1</guid><dc:creator>竹溪</dc:creator><category>应用安全</category><pubDate>Wed, 22 Jul 2026 06:21:47 GMT</pubDate></item><item><title><![CDATA[Jakarta Bean Validation 自定义校验，实现 "自解释" 的角色编码校验]]></title><link>http://riverlin-code.site/archives/wei-ming-ming-wen-zhang-tJIsl0w8</link><description><![CDATA[<img src="http://riverlin-code.site/plugins/feed/assets/telemetry.gif?title=Jakarta%20Bean%20Validation%20%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%A1%E9%AA%8C%EF%BC%8C%E5%AE%9E%E7%8E%B0%20%22%E8%87%AA%E8%A7%A3%E9%87%8A%22%20%E7%9A%84%E8%A7%92%E8%89%B2%E7%BC%96%E7%A0%81%E6%A0%A1%E9%AA%8C&amp;url=/archives/wei-ming-ming-wen-zhang-tJIsl0w8" width="1" height="1" alt="" style="opacity:0;">title: Jakarta Bean Validation 自定义校验，实现 "自解释" 的角色编码校验 date: 2026-07-10 categories: [Java, Spring Boot, Jakarta Validation] tags: [Jakarta Bean Validat]]></description><guid isPermaLink="false">/archives/wei-ming-ming-wen-zhang-tJIsl0w8</guid><dc:creator>竹溪</dc:creator><category>Jakarta Bean Validation</category><pubDate>Fri, 10 Jul 2026 09:50:16 GMT</pubDate></item><item><title><![CDATA[手写 MyBatis 通用枚举 TypeHandler]]></title><link>http://riverlin-code.site/archives/wei-ming-ming-wen-zhang-0tCQCaU5</link><description><![CDATA[<img src="http://riverlin-code.site/plugins/feed/assets/telemetry.gif?title=%E6%89%8B%E5%86%99%20MyBatis%20%E9%80%9A%E7%94%A8%E6%9E%9A%E4%B8%BE%20TypeHandler&amp;url=/archives/wei-ming-ming-wen-zhang-0tCQCaU5" width="1" height="1" alt="" style="opacity:0;">手写 MyBatis 通用枚举 TypeHandler 开发中的痛点 在我们开发中，枚举在数据库字段是 TINYINT类型，而在Java中是 Enum类型。如果不书写转换器或者手动转换，Mybatis就没办法正常将两者映射。 而在我们日常开发中经常会采用以下： 手动 if-else/switch，来]]></description><guid isPermaLink="false">/archives/wei-ming-ming-wen-zhang-0tCQCaU5</guid><dc:creator>竹溪</dc:creator><enclosure url="http://riverlin-code.site/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2FMybatis.webp&amp;size=m" type="image/jpeg" length="7694"/><category>Mybatis</category><pubDate>Sat, 28 Mar 2026 06:40:57 GMT</pubDate></item><item><title><![CDATA[Notion-笔记、文档、项目管理协同一体化平台]]></title><link>http://riverlin-code.site/archives/wei-ming-ming-wen-zhang-XxqIAxp2</link><description><![CDATA[<img src="http://riverlin-code.site/plugins/feed/assets/telemetry.gif?title=Notion-%E7%AC%94%E8%AE%B0%E3%80%81%E6%96%87%E6%A1%A3%E3%80%81%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E5%8D%8F%E5%90%8C%E4%B8%80%E4%BD%93%E5%8C%96%E5%B9%B3%E5%8F%B0&amp;url=/archives/wei-ming-ming-wen-zhang-XxqIAxp2" width="1" height="1" alt="" style="opacity:0;">Notion-笔记、文档、项目管理协同一体化平台 Notion 是什么？ Notion 的优势 强大的文本编辑与编排 无论是记录日记、笔记、整理资料、管理项目，还是构建代办事项、日程表，你都能在 Notion 找到合适的方式。 支持 Markdown 语法 丰富的块类型 文本、标题、待办清单、图片、]]></description><guid isPermaLink="false">/archives/wei-ming-ming-wen-zhang-XxqIAxp2</guid><dc:creator>竹溪</dc:creator><enclosure url="http://riverlin-code.site/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2FNotion_Logo.webp&amp;size=m" type="image/jpeg" length="5416"/><category>办公</category><pubDate>Fri, 27 Mar 2026 06:34:44 GMT</pubDate></item><item><title><![CDATA[@Transactional注解事务与锁引发的时序问题]]></title><link>http://riverlin-code.site/archives/wei-ming-ming-wen-zhang</link><description><![CDATA[<img src="http://riverlin-code.site/plugins/feed/assets/telemetry.gif?title=%40Transactional%E6%B3%A8%E8%A7%A3%E4%BA%8B%E5%8A%A1%E4%B8%8E%E9%94%81%E5%BC%95%E5%8F%91%E7%9A%84%E6%97%B6%E5%BA%8F%E9%97%AE%E9%A2%98&amp;url=/archives/wei-ming-ming-wen-zhang" width="1" height="1" alt="" style="opacity:0;">spring事务与锁引发的时序问题 双重保险下暗藏问题 我们在使用spring事务时，都接触过spring的注解事务@Transactional。有些场景下，我们在使用事务的同时，为了保证原子性操作会引进应用层锁，如:Synchroized、CeenCrantLock等。 @Service publ]]></description><guid isPermaLink="false">/archives/wei-ming-ming-wen-zhang</guid><dc:creator>竹溪</dc:creator><enclosure url="http://riverlin-code.site/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fspring%25E4%25BA%258B%25E5%258A%25A1%25E4%25B8%258E%25E9%2594%2581%25E5%25BC%2595%25E5%258F%2591%25E7%259A%2584%25E6%2597%25B6%25E5%25BA%258F%25E9%2597%25AE%25E9%25A2%2598_Spring_Logo.webp&amp;size=m" type="image/jpeg" length="22186"/><category>Spring</category><pubDate>Fri, 27 Mar 2026 06:16:59 GMT</pubDate></item><item><title><![CDATA[RBAC权限模型笔记]]></title><link>http://riverlin-code.site/archives/wei-ming-ming-wen-zhang-MG33XG2X</link><description><![CDATA[<img src="http://riverlin-code.site/plugins/feed/assets/telemetry.gif?title=RBAC%E6%9D%83%E9%99%90%E6%A8%A1%E5%9E%8B%E7%AC%94%E8%AE%B0&amp;url=/archives/wei-ming-ming-wen-zhang-MG33XG2X" width="1" height="1" alt="" style="opacity:0;">RBAC权限模型 最近在写一个项目，原本在权限控制模块使用的是层级的权限控制模型。而项目涉及到交错、交叉的权限，所以层级的权限控制就显得非常弱小。故而去学习了RBAC的权限模型，写了一篇学习笔记。 什么是RBAC权限模型？ RBAC（Role-Based Acess Control）即基于角色的访问]]></description><guid isPermaLink="false">/archives/wei-ming-ming-wen-zhang-MG33XG2X</guid><dc:creator>竹溪</dc:creator><enclosure url="http://riverlin-code.site/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fspring%25E4%25BA%258B%25E5%258A%25A1%25E4%25B8%258E%25E9%2594%2581%25E5%25BC%2595%25E5%258F%2591%25E7%259A%2584%25E6%2597%25B6%25E5%25BA%258F%25E9%2597%25AE%25E9%25A2%2598_Spring_Logo.webp&amp;size=m" type="image/jpeg" length="22186"/><category>Spring</category><pubDate>Fri, 27 Mar 2026 06:16:08 GMT</pubDate></item></channel></rss>