自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(123)
  • 收藏
  • 关注

原创 网页使用之如何返回json/xml

后端返回json数据给前端进行渲染的方式比较熟悉,至于返回html页面,返回xml的方式接触逐渐减少,来在项目中熟悉这一点。

2024-04-25 21:50:47 749

原创 请求参数解析

请求参数想必是很熟悉的,不过还是有许多的需要注意的。以下问题是否注意过?下面结合项目详解一下。如ReqRecordFilter中就对请求参数进行了解析,输出到req-log中。再比如 BodyReaderHttpServletRequestWrapper会对请求参数的流进行封装,避免请求因为i日志的打印提前消耗掉。下面,从get请求参数解析说起。

2024-04-22 22:12:55 846

原创 删除有序数组中的重复项

输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:返回新数组的长度 2,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:方法应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

2024-04-09 13:33:39 578

原创 移除元素Java实现

遍历结束后,j 的位置就是新数组的长度,因为它指向了第一个“空闲”的位置,也就是第一个没有被复制过的元素的位置。例如,方法返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。Java 并不存在引用传递,只有值传递,数组是一种特殊的对象,传递的是对象在堆中的地址,所以在方法中修改数组的内容是会影响到调用者的。输入:nums = [0,1,2,2,3,0,4,2], val = 2。输入:nums = [3,2,2,3], val = 3。

2024-04-09 11:26:47 447

原创 删除链表的倒数第 N 个节点

引入虚拟头节点后,删除头节点和其他节点的操作可以统一处理,因为头节点也会有一个前节点(即虚拟头节点)。找到节点后,将节点的前一个节点的 next 指向节点的下一个节点;将节点的下一个节点的 prev 指向节点的前一个节点,这样就将节点从链表中删除了。为了方便删除节点,我们需要一个虚拟节点,让虚拟节点的 next 指向 head,这样就能保证删除节点的前一个节点不为空。倒数第 4 个节点的前一个节点就是 5-4=1,也就是第一个节点。第一步,遍历链表,找出链表的长度,确定要删除的节点的位置。

2024-04-08 16:57:08 828

原创 Spring Boot 整合 RabbitMQ 实现延迟消息

Fanout模式不需要处理路由键(所以我们在 sendBroadcast 接口中,convertAndSend 方法中传递的 routingKey 是空的),我们只需要简单的将队列绑定到exchange上,发送到exchange的每一个消息都会被转发到与该exchange绑定的所有队列上。因为 TCP 连接是比较昂贵的,新建需要三次握手,销毁需要四次挥手,所以如果每个线程在想 RabbitMQ 服务端发送/接收消息的时候都新建一个 TCP 连接,就会非常的消耗资源,于是就有了信道。消息包括消息体和标签。

2024-04-04 15:28:59 987

原创 Java实现两数相除

题目要求不能用除法,不过我们处理溢出情况的写法,后面还是要用到的,尤其是 (long) dividend 这个强转的处理,其实就考察了基本数据类型的转换问题,包括最后返回的 (int) result,都是很细节的问题,但却很重要。很遗憾,前 5 个测试用例都是可以顺利通过的,但最后 1 个测试用例耗时会特别长,因为要计算 2147483648 / 1次,这个数太大了,所以我们要想办法优化一下。在数学中,加法是加减乘除的基础,减法是加法的逆运算,乘法是加法的倍增,除法是乘法的逆运算。

2024-04-04 13:58:26 847

原创 Spring Boot 整合 OSS 实现文件上传

OSS 也就是 Object Storage Service,是阿里云提供的一套对象存储服务,国内的竞品还有七牛云的 Kodo和腾讯云的COS。第六步,打开 Apipost,测试 OSS 上传接口,注意参数选择文件,点击发送后可以看到服务器端返回的图片链接。第二步,如果是 OSS 新用户的话,可以享受 6 个月的新人专享优惠价,不过续费的时候还是会肉疼。第三步,进入 OSS 管理控制台,点击「Bucket 列表」,点击「创建 Bucket」。第一步,在 pom.xml 文件中添加 OSS 的依赖。

2024-04-04 13:46:29 430

原创 最接近的三数之和

另外一个点是移动左指针还是右指针,当 sum 大于 target,说明 sum 太大了,需要减小 sum,那么就移动右指针,反之,如果 sum 小于 target,说明 sum 太小了,需要增大 sum,那么就移动左指针。那刷题其实就是这样,学会举一反三,遇到不同的题型,尽量去找到和它相似的题型,能不能按照之前的解题思路快速把这道题解出来,解出来后再想办法去优化。当输入是 nums = [-1,2,1,-4], target = 1 的时候,就需要移动左指针,因为 sum 太小了,需要增大 sum。

2024-04-01 16:48:58 874

原创 实现三数之和

对于题解 1 来说,很好掌握,因为有两数之和的基础,但效率不高。对于题解 2 来说,边界条件有点多,比如说第一层 for 循环要以。

2024-03-31 16:53:20 844

原创 Javase百问白答系列一

设计目的和思想:抽象类用于创建类继承层次结构,将具有相似行为和属性的类进行分组,并提 供默认实现。接口用于定义合同或规范,强调类应该具有什么行为而不是如何实现,不相关的类可以实 现相同的行为。类成员通常用来表示整个类的共享信息,实例成员则用于表示每个实例的个性化信息。实例成员被定义在类的内部,但在实例方法内部。它们与类的实例相关联,只有在创建类的实例时。实例成员在类的实例化过程中创建,实例被销毁时,实例成员也会被销毁。实例成员在每个类的实例化过程中会为每个实例分配独立的内存空间。

2024-03-30 22:07:22 632

原创 Spring Boot整合MyBatis-Plus,并通过AutoGenerator生成项目骨架代码

作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper。Mybatis Generator 是 MyBatis 官方提供的一个代码生成工具,完全可以胜任这个工作,不过最近在开发项目的时候试用了一下 MyBatis-Plus 官方提供 AutoGenerator,发现配置更简单,开发效率更高!

2024-03-29 18:54:35 1264

原创 整合SpringSecurity+JWT实现登录认证

这个类的主要作用就是告诉 SpringSecurity 那些路径不需要拦截,除此之外的,都要进行 RestfulAccessDeniedHandler(登录校验)、RestAuthenticationEntryPoint(权限校验)和 JwtAuthenticationTokenFilter(JWT 过滤)。第二步,在需要登录认证的模块里添加 CodingmoreSecurityConfig 类,继承自 codingmore-security 模块中的 SecurityConfig 类。

2024-03-28 19:03:34 1126

原创 Spring Boot 使用过滤器、拦截器、监听器

作用过滤器(Filter):当有一堆请求,只希望符合预期的请求进来。拦截器(Interceptor):想要干涉预期的请求。监听器(Listener):想要监听这些请求具体做了什么。区别过滤器是在请求进入容器后,但还没有进入 Servlet 之前进行预处理的。如下图所示。拦截器是在请求进入控制器(Controller) 之前进行预处理的。

2024-03-27 19:01:21 1249 1

原创 SpringBoot中处理校验逻辑的两种方式:Hibernate Validator+全局异常处理

实际开发中把两者结合在一起用,就可以弥补彼此的短板了,简单校验用 Hibernate Validator,复杂一点的逻辑校验,比如说需要数据库。

2024-03-27 17:49:58 824

原创 Spring Boot 整合 MyBatis

从整体上来讲,MyBatis 可以分为三层。接口层:SqlSession 是我们平时与 MyBatis 完成交互的核心接口;核心层:SqlSession 执行的方法,底层需要经过配置文件的解析、SQL 解析,以及执行 SQL 时的参数映射、SQL 执行、结果集映射等;支持层:核心层的功能实现,是基于底层的各个模块,共同协调完成的。

2024-03-26 16:42:15 1852

原创 MySQL WHERE 条件查询

所以,% 通配符可以连续出现,但是它们的含义是一样的,都是匹配任意长度的字符序列。不过,还是以出现在模式的两端最常见。这一节,我们学习了一些简单的 WHERE 条件查询,包括比较查询操作符、区间查询、枚举查询、NULL 查询、逻辑操作符、通配符查询等。文件中进行 SQL 语句的定义和拼接,比如说技术派的 admin 端在查询文章的时候,就是通过自定义 SQL 来实现模糊查询的。其中重点讲了 % 通配符的使用,包括 MyBatis 中的 # 和 $ 的区别,以及 MySQL 会如何处理连续的 % 通配符。

2024-03-26 16:42:05 945

原创 MySQL 之简单查询

在日常的开发工作中,查询语句也是最常用的,因为表在一开始设计的时候已经确定了,后期很少去修改表结构,也就意味着插入数据的方式也是确定的,但数据的展示方式却千奇百怪,用户端和 admin 管理端可能需要各种各样的数据,那 MySQL 就要提供最接近需求的数据,这样可以节省 Java 程序对数据的转换处理,也就相应提升了程序的性能。当然了,并不建议使用 * 通配符,因为这样会导致查询出来的字段过多,而且不利于程序的性能优化,尽量按需查询字段,就是当前需要什么字段就查询什么字段,不够用的话,再添加字段。

2024-03-24 14:55:29 590

原创 MySQL 字段定义时的属性设置

开发的时候第一步就是建表,在创建表的时候,我们需要定义表的字段,每个字段都有一些属性,比如说是否为空,是否允许有默认值,是不是逐渐等。这些约束字段的属性,可以让字段的值更符合我们的预期,也会为以后的数据查询和更新提供便利。比如说,我们在定义字段的时候添加了默认值,那在插入数据的时候,如果我们没有主动指定这个字段的值(比如 Java 程序中),数据库就会使用默认值帮我们自动填充。像在技术派项目中的文章详情表,我们为 id 字段设置了 NOT NULL、AUTO_INCREMENT、COMMEN

2024-03-21 22:27:11 1125

原创 如何实现图片上传至服务器

发表文章时上传文章封面时上传用户头像时通过编辑器的菜单添加图片。直接复制一张图片粘贴到编辑器中复制外部的图片链接(markdown格式),到编辑器中。导入MD文件到编辑器中(如果图片有连接时)。这四种方式都会出发图片上传功能(严格一点,后面两个还涉及到图片转链)后台的接口都是一样的,都调用的是ImageRestController,上传图片调用的是upload方法,请求参数为HttpServletRequest;转存图片链接调用的是save方法,参数为图片的外部链接。

2024-03-17 20:35:51 1166

原创 Filter实现请求日志记录

将锁有得外部访问都记录在日志文件里面,设计这个功能是为了(为什么):1. 在不引入Promentheus进行接口监控时,基于日志文件就可以实现整个项目得监控。2. 当出现问题时,可以基于此进行流量重放。效果如下(预期):来看一下请求日志记录得实现。

2024-03-15 22:06:25 777

原创 WEB三大组件之Filter

在很多项目中通常需要用到filter来实现用户身份识别,并将识别出来的用户信息,保存到ThreadLocal对应的上下文,这样在后续的请求链路中,在任何地方都可以直接获取当前的登录用户了。使用WebFilter注解,标注到实现自己额的过滤器上,有几个参数需要注意,其中urlPatterns最为常用,表示这个filter使用与那些url请求(默认场景下全部都被拦截)也可以在这一层做限流等)若判定通行,则进入Servlet逻辑,Servlet执行完毕后,又返回Filter,最后在返回给请求方。

2024-03-14 21:39:15 1199

原创 Redis实现计数统计

计数器大量应用于互联网上大大小小的项目,你可以在很多场景都能找到计数器的应用范畴,单纯以技术派项目为例,也有相当多的地方会有计数相关的诉求,比如文章带赞数评论数用户粉丝数......技术派中有两种查询计数相关的方案,一个是基于db中的操作记录进行实施,一种是基于redis的incr特性来实现计数器下面来看一下,redis的计数器是怎样用于技术派的技术场景的。

2024-03-13 17:16:57 1611

原创 技术派整合MyBatis-Plus

MyBatis-Plus支持自定义SQL语句,我们可以在接口中编写自定义SQL方法,并使用注解加自定义的SQL语句。/*** 根据三方唯一id进行查询* @return*/接口中定义了一个名为getByThirdAccountId的方法,它接收一个名为accountId的参数。该方法使用了@Select注解,这个注解用于编写自定义的SQL查询。

2024-03-13 17:13:57 1152

原创 公众号自动登录库表设计

我们将用户角色信息写入用户基本信息表中,没有单独抽出一张角色表来,然后进行映射,主要是因为这个系统逻辑相对清晰,没有太复杂的角色关系,因此采用了轻量级的设计方案。现在用户身份的方案很多,我们现在采用的是最基础的、历史最悠久的方案。用户首次登录之后,会在user表中插入一条数据,主要关注third_account_id这个字段,他记录的是微信开放平台返回的唯一用户id。我们在需要权限判定的接口上,添加上对应的权限要求,然后借助AOP来实现权限判断。现在采用的是,个人公众号的登录方式,很多的权限没有。

2024-03-12 17:33:36 415

原创 跨域问题解决方案

跨越对于前后端开发者来说,像一块狗皮膏药,无论是面试还是开发中,都会经常遇到。之所以出现跨域问题,是因为浏览器的同源策略,为了隔离潜在的恶意文件,为了防御五花八门的攻击,浏览器限制了从同一个源加载的文档或者脚本与来自另一个源的资源进行交互。同源策略要求,如果两个网页的协议、域名和端口都相同,他们才会认为是同源,否则就是跨域。同源策略是浏览器为了保护用户信息安全而实施的一种安全机制,可以防止恶意网站通过脚本窃取用户在其他网站上的数据,或者伪造用户身份执行一些操作。

2024-03-11 18:56:53 1073

原创 前后端分离项目,如何解决跨域问题?

跨域问题是前后端分离项目中非常常见的一个问题,举例来说,编程猫学习网站的前端服务跑在 8080 端口下,后端服务跑在 9002 端口下,那么前端在请求后端接口的时候就会出现跨域问题。403 Forbidden 是HTTP协议中的一个状态码(Status Code),意味着后端服务虽然成功解析了请求,但前端却没有访问该资源的权限。那怎么解决这个问题呢?

2024-03-10 22:25:38 1141

原创 Mysql/Redis缓存一致性

如何保证MySQL和Redis的缓存一致。从理论到实战。总结6种来感受一下。

2024-03-10 18:50:15 1145

原创 Redis实现用户活跃排行榜

在这里用户活跃度排行榜,主要是基于redis的zset数据结构来实现的,下面来看一下实例。

2024-03-09 13:58:15 1391

原创 JWT身份验证

在实际项目中一般会使用jwt鉴权方式。

2024-03-05 15:08:00 1272

原创 Session/Cookie身份验证识别

技术派当前的用户登录信息,主要借助最基础的session/cookie来实现的;现在虽然基本进入分布式session的时代了,但切实去看oauth,sso,jwt等各种登录方案之前,有必要学习最早的cookie/session,知道他的实现方式,然后再改造项目。

2024-03-05 09:15:15 626

原创 技术派Redis实现作者白名单

通过技术派发文章的时候,发文章会先通过审核,只有通过审核在会在网站上进行展示。是不是所有的作者都要经过审核呢?当然不是,在这里做了一个白名单,在白名单中的用户发文之后是不需要进入审核的,可以直接上线。问题的产生的疑问?

2024-03-03 16:22:15 1008

原创 技术派微信公众号自动登录

项目的整个登录流程是基于微信公众号来实现的,整套登录流程的设计?自我实现这样一个流程可以怎样去做?接下来将以一个工作中的一个功能相对完成的需求作为驱动,来设计确立实时方案来介绍。

2024-03-03 16:21:55 972

原创 掌握 MySQL 的数据类型

注意到 timestamp 类型的字段,还有一个属性 DEFAULT CURRENT_TIMESTAMP,这是设置默认值的,也就是说,如果插入数据的时候没有指定 create_time 和 update_time 的值,那么就会自动填充当前时间。但存储整数就完全没问题,0 的二进制表示就是 00,1 的二进制表示就是 01,2 的二进制表示就是 10,3 的二进制表示就是 11,4 的二进制表示就是 0100,以此类推(逢二进一)。这样做的好处是,避免了浮点数精度丢失的问题。且 M 必须大于等于 D。

2024-03-01 17:09:37 1208

原创 MySQL 表的基本操作,结合项目的表自动初始化来讲

有了数据库以后,我们就可以在数据库中对表进行增删改查了,这也就意味着,一名真正的 CRUD Boy 即将到来(😁)。

2024-03-01 15:33:38 816

原创 MySQL 的数据库操作,利用Spring Boot实现MySQL数据库的自动创建

执行 show databases;命令可以查看当前数据库的所有数据库。注意在 MySQL 客户端执行 SQL 语句的时候要带上分号;并按下 enter 键,不然 MySQL 会认为你还没有输入完,会换一行继续等待你输入。OK,像上面截图中的 information_schema、mysql、performance_schema、sys 这些都是 MySQL 自带的数据库,剩余的 、codingmore、pai_coding 等都是我本地创建的数据库。

2024-02-28 22:06:11 1416 2

原创 技术派数据库表自动初始化(学习)

比如库表创建的sql。

2024-02-28 21:01:57 704

原创 Spring Boot 整合 Redis 使用教程

作为开发者,相信大家都知道 Redis 的重要性。Redis 是使用 C 语言开发的一个高性能键值对数据库,是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。Redis 以超高的性能、完美的文档、简洁的源码著称,国内外很多大型互联网公司都在用,比如说阿里、腾讯、GitHub、Stack Overflow 等等。当然了,中小型公司也都在用。

2024-02-01 22:17:46 1804 1

原创 为 Spring Boot 项目配置 Logback 日志

也就是说,Logback 会在 classpath 路径下先寻找 logback-test.xml 文件,没有找到的话,寻找 logback.xml 文件,都找不到的话,就输出到控制台。由于 Spring Boot 的默认日志框架选用的 Logback,再加上 Log4j2 之前爆过严重的漏洞,所以我们这次就只关注 Logback。2)Spring Boot 的默认日志框架使用的是 Logback,启动编程喵项目的时候就可以看到 Logback 记录的日志了。查看字节码反编译后的文件就明白了。

2024-02-01 20:57:38 1305

原创 SpringBoot中处理校验逻辑的两种方式:Hibernate Validator+全局异常处理

实际开发中把两者结合在一起用,就可以弥补彼此的短板了,简单校验用 Hibernate Validator,复杂一点的逻辑校验,比如说需要数据库查询用全局异常处理来实现。

2024-01-31 22:38:18 1178

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除