Java

浏览该分类下的所有文章

HTML实现复制当前链接到剪切板

文章演示了在HTML页面中通过按钮实现复制当前页面链接到剪切板的完整步骤:使用<a>标签获取链接,点击按钮时动态创建隐藏的<input>,将链接写入并选中,调用 document.execCommand("Copy") 执行复制,依据返回值或异常弹出成功、失败或错误提示,从而实现“一键分享”。

HTML页面嵌入视频的方案

文章介绍了在HTML页面中使用 `<iframe>` 标签嵌入视频的基本方法,示例代码演示了如何通过 `src` 指定YouTube视频地址、设置宽高、允许全屏及相关权限。若需禁止自动播放,可在 `allow` 属性中加入 `autoplay=false`,并可通过 `style` 调整布局。整个实现简洁且可直接复制使用。

mapstruct的基本使用

MapStruct 是基于注解的编译期代码生成器,可通过普通 getter/setter 实现类型安全、无反射的对象映射,避免手写冗余代码并在编译时捕获映射不完整或类型不匹配的问题。文章先展示了原始的博客评论接口实现,代码臃肿且不易维护,随后引入 MapStruct 依赖并创建 `CommentInfoConverter` 接口,在其中通过默认方法把 `HttpServletRequest` 的参数转换为 `Comments` 实体,控制层只需调用 `commentInfoConverter.map(request)` 即可完成对象构建,代码更简洁。最后给出运行时报的 `NullPointerException` 堆栈,提示在使用旧版 1.2.0.CR1 时可能出现内部处理错误。

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 属地展示。

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。用户仅需一次操作,体验影响不大,却能有效提升公众号关注度。

Nginx知识总结

Nginx 是轻量高性能的反向代理/负载均衡服务器,跨平台、低内存、非阻塞异步 IO,能处理数万并发。常用于静态站点、虚拟主机、API 网关等。工作流程为 Master 进程监听端口、fork worker 进程抢 accept,基于 epoll 事件模型处理请求,实现高并发而无需多线程。支持正向/反向代理、动静分离、CDN 加速和轮询、权重、ip_hash、fair、least_conn 等负载均衡算法。配置文件结构简洁,cookie 存客户端、session 存服务器。相较 Apache,Nginx 更轻量、并发更强。

Redis 知识总结

Redis 支持丰富数据结构(string、hash、list、set、zset),原生集群、单线程+IO 多路复用实现高效。采用定期+惰性过期、maxmemory‑policy 多种淘汰策略。主从复制实现读写分离,Sentinel 负责监控、故障转移。持久化提供 RDB 快照和 AOF 日志,各有优缺点,常组合使用。Cluster 模式通过 16384 slot、一致性哈希和 gossip 协议实现水平扩展和高可用,支持多 master 多 slave。

消息队列基本原理和选型对比

消息队列解决解耦、异步、削峰填谷,常用点对点和发布/订阅模式。选型关注顺序、伸缩、留存、容错、可靠性、时序、吞吐、路由等。Kafka 吞吐高、持久可靠但全局有序和延时受限;RabbitMQ 路由灵活、支持定时消息,性能一般且学习成本高;Pulsar 计算存储分离,支持无缝扩容、跨地域复制和延时消息,架构较复杂;RocketMQ 提供顺序队列、P2P 与 Pub/Sub,可靠性高、协议丰富,社区活跃度一般。依据业务流量、可靠性和扩展需求选择合适实现。