38 归档分页
370 留言互动
4 核心专题

SpringBoot绕过Nginx代理获取客户端真实IP的解决方案

本文介绍在 SpringBoot 项目中通过 Nginx 代理获取客户端真实 IP 并解析其归属地的实现方案。首先在 Nginx 配置 `X-Real-IP` 与 `X-Forwarded-For` 头部,将真实 IP 传递给后端;随后编写 `IpUtil` 工具类,从请求头或 `request.getRemoteAddr()` 读取 IP;引入 `ip2region` 库并在资源目录放置 `ip2region.db`,使用 B‑tree 算法查询 IP 对应的省、市或国家信息;最后在控制层调用 `IpUtil.getIpAddr` 与 `IpUtil.getIpPossession`,将解析结果显示在评论区,实现博客评论的 IP 属地展示。

NC57 反转数字

题目要求在不使用 64 位整数的前提下,对 32 位有符号整数的数字部分进行翻转,保留符号位,若翻转后超出 \[-2³¹, 2³¹‑1\] 范围则返回 0。解法思路是循环取出原数的最低位(x % 10),累乘 10 并加到结果 res 中,同时将 x 除以 10。为判断溢出,使用 long 类型暂存结果,最后检查 `(int)res == res`,若相等返回转化后的 int,否则返回 0。示例包括正数、负数、含尾零以及溢出情况。

NC35 编辑距离(二)

本文介绍了编辑距离的变形问题:在给定插入、删除和替换三个操作代价的前提下,求将字符串 str1 编辑为 str2 的最小总代价。要求时间复杂度为 O(n²),空间复杂度为 O(n)。文章通过动态规划构建二维数组 dp[i][j],表示将 str1 前 i 个字符转换为 str2 前 j 个字符的最小代价,初始化第一行和第一列分别对应纯插入或删除的成本,随后递推考虑字符相等、插入、删除和替换四种情况,最终返回 dp[len1][len2]。提供了完整的 Java 实现代码示例,并给出两组示例输入输出验证算法正确性。

NC38 螺旋矩阵

本题要求对任意 m × n 矩阵按顺时针螺旋顺序输出所有元素,数据规模 0 ≤ m,n ≤ 10,元素绝对值 ≤ 100,时间、空间均需 O(mn)。解法采用四个边界指针 left、right、up、down,循环在边界未交叉时依次遍历上边从左至右、右边从上至下、下边从右至左、左边从下至上,并在每次遍历后收缩相应边界,直至完成。代码实现简洁,先排除空矩阵,随后在 while 循环中按上述顺序加入结果列表,满足题目要求。

Optional详解

Optional 是 Java 8 为避免 NPE 而提供的容器类,使用 of、ofNullable、empty 创建实例,内部不可直接 new。常用方法包括:get 在值为空时抛异常;isPresent 判断是否非空;ifPresent 为空时不执行,非空时执行 Consumer;filter 根据 Predicate 过滤返回自身或空 Optional;map 将值映射为新对象并包装;flatMap 直接返回另一个 Optional;orElse、orElseGet、orElseThrow 在值为空时分别返回默认值、惰性 Supplier 或抛自定义异常。文中通过 Person 示例演示各方法用法,并给出 Service 层查询、DAO 返回 Optional 的实战场景,强调根据业务需求选用合适方法以提升代码可读性和安全性。

什么?十行代码实现了斗图?

文章介绍了在评论区实现“斗图”的两种方案:上传图片或直接输入图片链接。由于上传会占用服务器存储且对非表情包用户不便,作者选用第二种方式,即在评论框输入以 http/https 开头的图片地址,提交后通过 JavaScript 检测并自动包装成 `<img>` 标签显示。文中提供了相应的 HTML textarea 示例和核心 JS 代码,并演示了使用方法,推荐使用表情包网站复制图片地址直接粘贴即可。

博客的评论与回复功能的实现

文章详述了在个人博客中实现完整评论与回复功能的全过程。首先设计评论表结构,加入blogId、parentId等字段以实现关联和层级关系;随后在页面构建评论表单,利用QQ接口自动获取昵称、头像和邮箱。前端通过jQuery捕获提交和回复操作,构造请求数据并使用Ajax发送至后端。后端Controller接收参数并保存评论,随后根据parentId为‑1的根评论遍历并组织子评论,实现三级嵌套显示。关键点在于新评论置顶、子评论紧随父评论显示,以及通过parentId实现评论的层级结构。全文提供了实体类、HTML、JS及后端代码示例,帮助读者快速搭建可交互的博客评论系统。

面试官:synchronized可以锁字符串吗?

`synchronized`只能锁住引用相同的对象。`new String("...")`每次都会生成不同的堆对象,导致并发不受限制;而直接使用字面量或 `String.intern()` 把字符串放入常量池后,所有线程锁的是同一实例,才能实现互斥。但把所有字符串放入常量池会占用大量内存,回收只能依赖 Full GC,存在性能风险。推荐使用 Guava 的 `Interner`(弱引用实现),既能保证同一值的唯一锁,又能在内存不足时自动回收。

博客导流到微信公众号

文章介绍了在个人博客中通过 OpenWrite 的“博客导流公众号”功能,将首次访问的读者引导关注微信公众号并获取验证码,从而为公众号带来流量。实现步骤包括:在 OpenWrite 平台注册登录后,进入“增长工具”→“博客导流公众号”,填写博客域名和长期有效的二维码图片链接;在公众号后台设置触发关键字(如“博客”)用于发送验证码;在博客页面嵌入指定的 JavaScript 代码并在文章外层添加 id 为 “container” 的 div。用户仅需一次操作,体验影响不大,却能有效提升公众号关注度。