自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 CommandLineRunner

在这个方法中,你可以访问传入的命令行参数(尽管这在实践中可能不常见,因为通常 Spring Boot 的配置文件已经提供了所有必要的配置),并执行所需的启动逻辑。在这个例子中,MyCommandLineRunner 类通过 @Component 注解被 Spring 容器管理,这意呀着当 Spring Boot 应用程序启动时,Spring 会自动找到这个类并调用其 run 方法。CommandLineRunner 提供了在应用启动时执行代码的能力,但过度使用可能会导致应用启动时间变长,从而影响用户体验。

2024-08-20 15:40:11 110

原创 【微服务】微服务组件之Nacos注册中心和配置中心的使用

Service)是阿里巴巴开源的一个动态服务发现和配置管理平台,专为微服务架构和云原生应用设计。它旨在简化服务注册、配置管理和服务治理的复杂性,通过提供一套简单易用的特性集,帮助开发者快速构建、部署和管理微服务应用。

2024-08-20 09:32:57 531

原创 Controller中接收数组参数 post请求中在body中传+post请求中通过表单形式传(x-www-form-urlencoded)

需要根据用户id集合批量删除用户数据,前端使用post请求,controller中参数接收数组参数并根据用户id删除用户基本信息。请求体中为json字符串,后端新建一个UserDTO(用户数据传输类),用于接收前端json参数。需要注意的是,上图中不是选择的form-data (这是get请求通过表单形式提交应该选择的)

2024-08-19 15:01:10 381

原创 GitLab Merge Request流水线

reviewer打开链接,点击changes,review相关改动的code,如果没什么问题就返回overview,提交者在自己的分支改完代码上传之后,merge request会自动更新,提交者@审核者再去查看改动,直至通过。2.后续在各自的分支上开发提交,当自己的需求模块开发完毕,要合并入dev分支时,需要去gitlab上创建Merge Request。ps:下次要创建merge之前,记得合并dev分支的代码到自己的分支,类似之前git代码推之前先拉取一下。审核通过,代码会合并入对应的分支。

2024-08-19 14:34:44 160

转载 springboot 对于@Autowired 注入为null 的介绍与解决方式

(2)你的这个类有被new出来的实例的,new 过的对象不会交给Spring容器管理 所以里面的 service或者dao注入不进来。一般是指引用某些框架,你是继承某个接口,但是这些框架默认new过这个方法,比如MVC拦截的HandlerInterceptor类。(1)比如我想在某个类实现RedisUtils 类的注入,但是用@autowired 会报null。对于(1)其实就加入@Component 就可以了。(1)该类没有托管给spring 管理,一般在类的上面添加@Component。

2024-08-16 14:35:36 23

转载 Stream之flatMap

目标:将如下对象中的分类category提取出来,去重。其中如"哲学,爱情",需要解析为两个分类,[“哲学”,“爱情”]flatMap:将小Stream转换为大Stream。

2024-08-16 11:18:58 34

转载 Java Stream通过findFirst()查找满足条件的一条数据

findFirst是短路终端操作(short-circuiting terminal operation),流操作是一组中间操作和终端操作,如果中间操作可以为无限输入生成有限流,则它是短路(short-circuiting)。示例2:下面是使用IntStream、LongStream和DoubleStream的findFirst方法的示例。如果findFirst选择的元素为null,它将抛出NullPointerException。回:findFirst方法返回Optional包含流中第一个元素的元素。

2024-08-16 11:08:20 28

原创 【RestTemplate 】RestTemplate postForObject使用+如何创建一个配置为忽略 SSL 证书和主机名验证的 RestTemplate 实例

紧急修复或绕过:在极少数情况下,如果生产环境中的SSL/TLS配置出现问题,导致正常业务受到严重影响,而快速修复不可行时,可能会考虑临时忽略SSL证书验证以恢复服务。然而,这应被视为最后的手段,并且应立即着手解决根本问题。内部网络或受信任的网络:如果你的应用程序在内部网络或你完全控制并信任的网络中运行,那么可能不需要通过标准的SSL/TLS验证来确保安全性。教育和学习目的:在学习或教授网络编程和安全性时,为了帮助学生或开发者理解SSL/TLS的工作原理和重要性,可能会故意配置忽略SSL证书验证的环境。

2024-08-16 10:58:15 241

原创 1093 - You can‘t specify target table ‘inventory_item‘ for update in FROM clause

错误信息 “You can’t specify target table ‘inventory_item’ for update in。FROM clause” 通常是因为你在尝试更新(UPDATE)、删除(DELETE)或者在某些数据库系统中进行 SELECT …MySQL)中是不被允许的,因为这样做可能会导致不可预测的结果或者更新/删除操作与读取操作之间的数据不一致。FOR UPDATE 操作时,直接从目标表中读取数据。这种做法在许多数据库管理系统(如。

2024-08-15 17:56:42 185

原创 JSONUtil、JsonArray应用 (全网最全面的解析方式汇总) - 调用第三方接口后,获取的结果如何转化成对象,转化成对象之后又如何解析

其实调用三方接口分为几步1、采用哪种方式调用三方接口,这种依赖于第三方系统是提供了什么样的接口,目前我了解的到的接口有http接口还有dubbo接口等。如果是http接口的话,可以看我的另外一篇文章 ,本篇文章很详细的总结了多种调用三方接口的API方法,并且包含post、get等不同方式的请求;对于dubbo接口如何调用,我初步理解为 我们将提供服务的jar包依赖放到pom.xml中,并在相关类中通过dubbo注解引入即可。如下图对于dubbo接口的调用,我后面也会出一篇博客~

2024-08-15 17:46:50 948

转载 java 对外开放接口鉴权 对外api接口开发还应该考虑哪些内容?

3、客户端拿到这个随机数后将其与appsecret拼接生appsecretStr,然后调用生成签名方法,传入appsecretStr,appkey,nonce,url(备注:可转大写,转小写,追加特殊字符,然后加密)进行非可逆加密(MD5/SHA1等),生成签名A。第二次调用,查询redis,如果key存在,则证明是重复提交,直接返回错误。反之,查出appsecret,按照客户端的签名加密方式,进行加密,生成签名B,比较A和B,如果一样则生成token,失效缓存中的nonce,返回token。

2024-08-11 20:16:24 36

原创 api接口的安全设计:使用token+sign+时间戳

服务端以api的方式将数据响应给客户端是目前的趋势,可以用在前后端分离的架构中,前后端分离之后,前后端人员能够更加专注于自己板块的东西,也可以用在服务端与服务端相互调用中。拿到接口后,客户端就可以通过api获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口来获取数据,因此我们的api接口就要使用安全验证。具体的操作为:客户端在生成sign值时,除了使用所有的参数和token外,再加一个发起请求时的时间戳。

2024-08-11 13:59:02 887

原创 @ResponseBody详解

responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。@ResponseBody也可以作用在类上,表示这个类所有方法都是返回JSON数据。

2024-08-11 12:25:05 934

原创 提供三方API接口、调用第三方接口API接口、模拟API接口(四)使用AOP切面编程实现防止未登录提交业务及避免重复提交

先调用获取token接口,并把最新的token携带到token验证的请求头中(日常开发中前台获取token的接口,然后携带这个token做其他业务。我们为了使得代码更精简,通过AOP的方式来实现登录后才能提交业务的验证、防止重复提交验证。获取到token,其实就是向redis中投放了一个特定的键值对。重头戏来了,我们访问我们的有token验证的测试接口。验证结果:不通过,提示 :请求失效,请勿重复提交!当我们携带的token。我们首先只传参数,但是不带token信息,调用:接口,验证通过。

2024-08-11 12:15:35 401

原创 提供三方API接口、调用第三方接口API接口、模拟API接口(三)使用AOP切面编程实现signature签名验证

可以看到,验证提示 该请求无签名!,而且也没有打印controller中模拟业务的代码(“做一些业务,业务模拟”)。需要携带上参数,不然有签名没用,因为签名就是为了验证参数是否发生了变化。至此完成了,AOP实现签名验证的代码实现。接下来先通过AOP实现参数签名校验;码字不易,不足之处还请大家多多指教~

2024-08-04 16:26:10 396

原创 提供三方API接口、调用第三方接口API接口、模拟API接口(二)通过token实现防止业务接口的重复调用

背景:紧接着上一篇,API中的签名认证,我通过signature签名机制保证了,参数不被修改,但是如果我们提供给外部的接口(此时我们作为第三方),如果被外部恶意重复调用怎么办?此时,我们可以保证请求参数不会被修改,但这不能保证接口不被重复调用,因此还需要token、timestamp来辅助。模拟重复提交表单。

2024-08-02 16:48:09 979

原创 提供三方API接口、调用第三方接口API接口、模拟API接口(一)通过signature签名验证,避免参数恶意修改

为什么要设计安全的api接口运行在外网服务器的接口暴露在整个互联网中,可能会受到各种攻击,例如恶意爬取服务器数据、恶意篡改请求数据等,因此需要一个机制去保证api接口是相对安全的。本项目api接口安全设计本项目api接口的安全性主要是为了请求参数不会被篡改和防止接口被多次调用而产生脏数据,实现方案主要围绕令牌(token)、时间戳(timestamp)、签名(signature)三个机制展开设计。模拟前端签名与后端验证签名RSA密钥对生成KeyPairGenerator生成RSA密钥对自定义G

2024-08-02 10:22:04 506

原创 Base64.decodeBase64()是一种加密方式吗 和 URLDecoder.decode(sign, “utf-8“) 两种方式有什么区别?

Base64编码是一种用64个字符来表示任意二进制数据的方法,它常用于在文本格式中存储或传输二进制数据,如图片、音频、视频等文件的编码,以及在URL、Cookie、网页中传输少量二进制数据。8及以后的java.util.Base64中,方法名可能有所不同,如java.util.Base64.getDecoder().decode(byte[]它不是加密方式,因为Base64编码是可逆的,任何人都可以轻松地将Base64编码的字符串解码回原始数据。,因为URL编码也是可逆的,解码过程相对简单。

2024-07-30 16:45:49 527

原创 URLDecoder.decode(String s, String enc) 是在做什么?效果演示

数据编码encode、decode的作用。

2024-07-30 15:25:02 329

转载 【Redis】工作中使用Redis的10种场景

但使用缓存加速的业务场景,需要注意一下,可能会出现:缓存击穿、穿透和雪崩等问题,感兴趣的小伙伴,可以看看我的另一篇文章《烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?因此,可以考虑用一个定时任务,异步将分类树的数据,直接缓存到Redis当中,定义一个key,比如:MALL_CATEGORY_TREE。bitmap 是二进制的byte数组,也可以简单理解成是一个普通字符串。这样后面该用户访问其他接口的时候,会直接从Redis中查询用户登录状态,如果可以查到数据,说明用户已登录,则允许做后续的操作。

2024-07-25 17:28:52 33

原创 【多线程】synchronized 原理、使用、注意事项详解

synchronized是Java的一个关键字。来自官方的解释:Synchronized方法支持一种简单的策略,用于防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读或写操作都通过Synchronized方法完成。Synchronized保证同一时刻有且只有一条线程在操作共享数据,其他线程必须等待该线程处理完数据后再对共享数据进行操作。

2024-07-25 16:12:20 647

原创 【lamda表达式】在多线程开发中的lamda表达书简化参数

很明显其中的 executor.execute()中传的参数还是Runnable类型,只不过这个类型参数中的run方法中只有一行调用handle()方法的代码,所以简化完之后就变成了 executor.execute(() -> handle());这个还需要多多使用,慢慢就熟练了。创建线程后传Runnable参数并实现run方法,可以采用下面两种方式,效果是一样的。对于线程池中提交任务代码,也可以这样简化:可以采用下面两种方式,效果是一样的。

2024-07-24 15:56:13 419

原创 【分布式】分布式锁的业务应用场景

例如,在更新缓存中的数据时,先加锁,更新完成后再释放锁,确保同一时间只有一个服务实例能够修改缓存数据。在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导致商品出现 库存超卖 (数据不一致) 现象,对于这种情况代码中并没有做任何控制。小T下面的一位兄弟正在压测,发现个小问题,因为在终端设备上跟鹅厂有紧密合作,调用他们的接口时需要获取到access_token,但是这个access_token过期时间是2小时,过期后需要重新获取。

2024-07-24 14:30:33 742

原创 Redission中的Lua脚本写法、理解

如果条件表达式的值为假(例如,如果我们将a的值改为30),则Lua会跳过then后面的代码块,直接执行else后面的代码块(如果提供了else部分的话)。因此,Lua执行了then后面的print语句,输出了"a is less than b",然后遇到了end关键字,if语句的执行结束。在redission中也是支持锁重入的,他采用了hash结构来存储锁,其中大key标识这把锁是否存在,小key表示这把锁当前被谁持有。首先,我们先基本的熟悉一下lua脚本的逻辑。对于源码中的Lua脚本又是什么意思?

2024-07-23 18:14:51 632

转载 Redisson分布式锁源码浅析

总结:在调用lock()方法时,我们可以传入自定义的超时时间,也可以不传,如果不传那么将会使用Redisson默认的看门狗时间30s,需要注意的是,如果我们使用了自定义超时时间,那么Redisson不会自动为我们的锁续期,而不传时间Redisson会使用默认30s超时时间并且会自动为我们的锁进行续期。进入tryAcquire()→ tryAcquireAsync()方法,该方法首先会判断释放时间是否为-1,如果为-1则代表我们在前面没有传入超时时间,根据这个判断结果将会走两条不同的路。

2024-07-23 18:07:18 33

原创 【分布式锁】Redission实现分布式锁

接着上一节,我们遇到了超卖的问题,并通过Redis实现分布式锁,进行了解决。本节 我将换一种方式实现分布式锁。可以看到,没有超卖现象。至此Redission实现分布式锁已经OK。provider-and-consumer 端口 8023。rabbitmq-consumer 端口 8021。

2024-07-23 11:24:37 674

原创 【分布式锁】Redis实现分布式锁

线程1休息的时间超过了过期时间,此时锁会自动释放。此时就会发生蝴蝶效应,线程1删除了线程2的锁,线程2删除了线程3的锁,直到最后一个"哥们:wc,我锁了?最后删除锁的时候,我这里使用了先判断是否是当前处理的服务的本次处理设置的分布式锁,如果是,才删除,否则不让删除其他线程的服务处理产生的锁,这里一定需要注意,否则会产生锁误删的情况,会让分布式锁失效!我们发现,这两个服务虽然单独的看,销售的商品都是正确的,但是放在一起看,就会发现有相同的库存,这就说明,同一个库存被卖了两次,我们上文提到的超卖问题仍然存在!

2024-07-23 10:13:59 955

原创 【分布式锁】ReentrantLock或者synchronized 为什么无法担任分布式锁

后两者的使用较为常见。但是使用不同的分布式锁,又会需要考虑不同的风险,对不同的风险予以应对。不同的实现风险及解决方案可见我的另外一篇博客:待补充。

2024-07-19 17:47:08 341

原创 【JAVA 常用API】数据库字段存储JSON格式数据,JAVA中如何将List<Entity>或者对象实体转换为字符串

在Java中,可以使用第三方库如Jackson或Gson来进行JSON的转换。这些库提供了将Java对象转换为JSON字符串的方法。在代码中,使用ObjectMapper类的writeValueAsString()方法将List转换为JSON字符串。首先,需要在项目中引入相应的库。转换后的JSON字符串可以直接使用或进行进一步处理,例如存储到数据库、传输到其他系统等。

2024-07-18 10:46:52 498

原创 【多线程】线程池提交的任务,被拒绝策略处理时,能不能获取到当时子任务的实例对象呢? 队列的处理,排队效果模拟

我通过匿名内部类的方式自定义了一个拒绝策略,并实现了其中的拒绝方法rejectedExecution(),而对于其中固定的参数,是否可以通过转换获取到真实的Runnable实现类的实例呢。接下来我们一起验证一下,同时也看下具体,线程池提交一些任务,哪个任务会进队列,哪个会被核心线程直接执行,哪个又会被拒绝。说明:因为每个子任务需要执行的业务逻辑没有,我通过sleep()来模拟实际业务花费的时间;为了看一下拒绝策略的拒绝效果是什么样的。

2024-07-18 09:56:25 516

转载 【多线程】AbortPolicy策略验证

作为子类,他们都实现了 RejectedExecutionHandler 接口 ,通过重写接口方法(参数 r 为任务线程,参数 e 为当前的线程池 ),以父类作为参数传入自定义的线程池 (如果觉得描述不清楚,可参看下面线程池通过接口回调的方式使用拒绝策略的小demo)。不知道小伙伴们看着眼熟不,乍一看,呦呵,这个自定义线程池还默默的用了一下设计模式呢~拒绝策略以接口形式作为参数,实际调用的时候传入的是该接口的子类,而线程池使用的是其重写的拒绝策略方法。soga~原来是使用了策略模式啊。

2024-07-17 17:49:24 34

原创 【多线程】线程池中的队列有哪些,应该如何选择

线程池中的队列是线程池的重要组成部分,用于存放待执行的任务。在Java中,线程池常用的队列类型包括无界队列、有界队列、直接提交队列(SynchronousQueue)、优先级队列等。

2024-07-17 10:37:21 716

原创 【多线程】线程池的最优参数设置,如何考虑?

(2)而CachedThreadPool允许的最大线程数量为Integer.MAX_VALUE,而且核心线程数为0,意味着 只要有任务进来,就会频繁创建新线程,没有任务之后又要关闭线程,耗费性能。另一方面,由于允许创建大量的线程,也有导致OOM的潜在隐患。为了最大程度利用线程池的资源,充分发挥线程池的执行效率,需要对线程池的主要参数进行合理的设置,对于不同的业务和场景,也需要根据实际情况来进行调整。如果线程池中的线程数小于核心线程数,新的任务将创建新线程来处理,即使有核心线程处于空闲状态。

2024-07-17 09:31:32 1001

原创 【多线程综合】java何时考虑线程安全问题、怎么考虑、又怎么解决?

多线程怎么考虑,什么时候需要考虑,怎么实现?

2024-07-16 17:44:14 1197

原创 【多线程】多线程之哪些内容需要考虑线程安全问题?

多线程

2024-07-16 14:33:59 864

转载 静态代理和动态代理

而动态代理适用于需要动态改变代理类的行为、扩展代理类的功能的情况,例如在某些框架中用于实现远程调用、事务管理、日志记录等功能。静态代理是指代理类的代码在编译时就已经确定,也就是说,代理类的实现是由程序员手动编写的。动态代理是指代理类的代码在运行时动态生成,也就是说,代理类的实现是由运行时环境自动生成的。无法动态地改变代理类的行为:由于代理类的代码在编译时就确定,因此无法在运行时动态地改变代理类的行为。-代理类的创建时期:静态代理的代理类在编译时期就已经确定,而动态代理的代理类是在运行时动态地生成的。

2024-07-08 17:27:13 20

原创 【nginx】反向代理和正向代理的区别

客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。两者的区别在于请求的流向和代理服务器与目标服务器的关系,正向代理中代理服务器与客户端处于同一侧(客户端通过代理服务器获取特定的资源),反向代理中代理服务器与目标服务器处于同一侧(服务端通过代理服务器处理客户端的请求)。反向代理:对外是透明的,访问者并不知道自己访问的是代理。

2024-07-08 17:15:02 1331

原创 【nginx】一般nginx会和目标服务部署在同一台服务器上?

Nginx与目标服务是否部署在同一台服务器上并没有固定的答案。你需要根据项目的实际需求、资源限制以及安全要求来做出最合适的选择。在实际应用中,很多项目会采用混合部署策略,即根据服务的不同特性和需求来灵活选择部署位置。

2024-07-08 16:49:07 258

原创 【nginx】nginx的配置文件到底是什么结构,到底怎么写?

而且还存在一个现象:我通过taskkill/f /pid 29980 这个来杀掉nginx进程时候,我先杀掉其中某个进程,然后就自动产生了一个进行,还是保持着两个进行,如果我杀掉另外一个,则就不会产生了,后来经过查阅相关资料,存在 子进程和主进程的关系,如果我直接杀掉其中的主进程的话,就不会再产生了,就只留下来了子进程,我再去杀掉子进程,此时两个进程就都没了,此时nginx就被完全的关闭了【这个只是关闭nginx的一种方式】正常的还是推荐使用nginx stop 和quit命令来正常关闭nginx。

2024-07-08 16:44:50 1111

原创 【Redis】Redis自动序列化和手动序列化的区别(存储结构、内存开销,实际写法)

【代码】【Redis】真行,原来是这样啊!--Redis自动序列化和手动序列化的区别(存储结构、内存开销,实际写法)

2024-07-05 15:42:50 182

空空如也

空空如也

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

TA关注的人

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