自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 优雅实现数组切片和拼接

某次的业务开发中,需要对字符串进行分割(split)并提取其中的某些部分以进行组合。希望在未来的几年里,Java能够在这方面优化其数组操作的API,使得此类常见操作更加便捷。Stream.concat() 方法会一次性加载所有元素到内存中,因此如果要拼接的数组非常大,可能会有性能和内存消耗方面的考量。Java对于数组的切片操作,没有直接提供类似于 JavaScript 中 slice() 方法那样便捷的功能,只能利用 Arrays.copyOfRange() 方法来实现数组的切片。

2024-04-27 08:00:00 292 1

原创 网络安全必修课:掌握身份标识、认证、授权和问责的核心概念

控制对资产的访问是安全的中心主题,资产可以是有形的或无形的。有形资产是指你可以触摸的东西,如物理设备,而无形资产是指信息和数据,例如知识产权。除了人员之外,资产还可以是信息、系统、设备、设施或应用程序。组织实施访问控制机制的主要原因之一是预防损失。IT 损失分为三类:保密性(confidentiality) 、完整性(integrity)和可用性(availability) 的损失,即 CIA 损失。下面在访问控制的上下文中对 CIA 三性进行定义。保密性。

2024-04-26 10:46:18 829 1

原创 程序员到架构师,架构模型不能脱离实际代码

想象一下,现在的软件开发越来越被当成工厂的流水线,经验丰富的架构师仿佛是那些精心设计模具的老师傅,而技能水平较低的工人则负责在流水线上把原材料倒进模具里,期待着成品出现。但是,现实远非如此简单。这种思维模式,就好比是让米其林大厨只负责菜单设计,而让实习生去实际烹饪,结果往往是菜肴难以入口,顾客抱怨连连。因为软件开发的本质,就像是烹饪一道精致的法式大餐,每一步都充满了创意与精细的调整,每一环节都需要那份匠心独运。

2024-04-26 09:42:00 886 3

原创 告别单一密码,多因素身份认证带你进入安全新纪元!

当我们探讨多因子/多因素身份认证时,我们可能会好奇这里的“因素”具体指的是什么?显然,用户名和密码是一种因素,但验证码是否也能被视为另一种因素呢?让我们一起来深入了解一下三种主要的身份验证因素:知识因素,也被称为“你知道什么”。这包括了所有需要记住的秘密信息,比如密码、PIN码等。在早期的文献中,这一因素通常被归类为类型1身份验证因素。物理因素,也被成为“你拥有什么”。这可能包括智能卡、硬件令牌、存储卡或通用串行总线(USB)驱动器等。在早期的文献中,这一因素通常被归类为类型2身份验证因素。

2024-04-25 16:25:58 1091 3

原创 程序员到架构师,除了代码,还有文档和图

作为人类,我们天生就被视觉所吸引。在这个信息爆炸的时代,从精炼的代码到清晰的文档,再到直观的图,我们追求的是更高效、更直观的信息传递方式。尽管一段优雅的代码能够以其简洁和精确性展现出强大的表达力,但它无法保证,每一次它所传递的信息都是准确无误的。代码的内容虽然可以表达自身,但函数的命名可能会产生误解,变量的命名和代码的结构也未必能始终如一地准确传达其意图。即使我们不断的使用优秀的编程风格和实践,在努力使这种联系更加直接和明确,但这仍然需要开发者的自律和认真的工作。

2024-04-25 09:58:50 819

原创 单点登录:SAML、OAuth2、OIDC 的区别与联系

进一步的,同一个Client在不同Application Server可能也有不同的权限,这时候Authentication Server就需要包含Authorization Server(授权服务)功能。举个例子,我登录CSDN的时候,有个选项是是否使用微信登录,如果使用微信登录,就会从微信服务获取用户信息并登录。OIDC的核心在于授权过程中,一并提供用户的身份认证信息ID-Token(使用JWT来包装)给到第三方客户端,OP通常还提供了GetUserInfo的接口,用于获取用户更完整的信息。

2024-04-24 15:07:22 1405

原创 程序员到架构师,该学习如何说话

通常,程序员可以根据自己对问题的理解来编写代码。只要他们定义了清晰的输入和输出接口,并且能够通过预设的测试数据使程序顺利运行,开发工作就可以说是完成了一大部分。然而,在与产品经理或用户沟通时,我们经常发现,基于编程的术语和概念对于非技术人员来说是很难理解的,特别是当涉及到代码循环、数据库结构等专业词汇时。因此,在软件开发过程中,如何有效地将项目成员的心智模型转化为业务领域的深层术语和关系,从而确保业务模型与开发活动之间更紧密的整合,是对程序员在其职业生涯中需要达到的一个更高的水平。

2024-04-24 09:51:03 987 4

原创 解决Spring全局异常捕获不生效的问题

Spring项目全局异常处理不生效,登录接口报错异常信息被直接返回到接口响应中。

2024-04-23 16:35:38 730

原创 从程序员到架构师的一小步

首先是需求分析,这可能会包括人们如何使用应用的情节或场景,这些情节或场景可以被编写成用例(use case)。用例是需求分析中的一种常用工具。用例不是具体的代码实现,而只是对情节或场景的描述。例如,下面是一个简单的登录场景的用例。登录场景:用户请求登录。系统展示登录页面,提供登录方式,如果登录信息校验通过则返回登录成功信息,否则提示登录失败。代码如下(示例):以Java为例,面向对象的分析关注从对象的角度来创建领域描述。面向对象分析需要鉴别其中的重要的概念属性和关联。

2024-04-23 14:00:31 1067

原创 解决IDEA调试方法进不去与数据看不到的问题

解决IDEA调试方法时,部分方法步进失败,部分数据无法显示的问题

2024-04-23 10:22:44 284

原创 解决Valid在@RequestParam场景不生效的问题

解决Valid在@RequestParam场景不生效的问题

2024-04-22 21:07:00 486

原创 【IDEA关闭项目一直转圈】

解决idea关闭项目窗口一直转圈的问题

2024-02-18 10:11:55 6291 5

原创 多线程的之生命周期状态流转

一图胜千言:1,new Thread后会直接进入runnable状态吗?当我们用关键字new创建一个Thread对象时,此时它并不处于执行状态,因为没有调用start方法启动该线程,那么线程的状态为NEW状态,准确地说,它只是Thread对象的状态,因为在没有start之前,该线程根本不存在,与你用关键字new创建一个普通的Java对象没什么区别。NEW状态通过start方法进入RUNNABLE状态。2,runnable状态就会立马获取CPU拥有权并执行吗?线程的运行与否和进程一样都要听令于CP

2020-07-24 17:55:31 284

原创 ConcurrentHashMap

开篇总结JDK7,8的区别JDK8中的实现降低了锁的粒度,在JDK7中基于Segment,每个Segment包含多个HashEntry(即HashEntry数组)。同时Segment数默认为16,理论上来说最多可以同时支持16个线程并发写,只要它们的操作分别分布在不同的Segment上。这个值在初始化时可以设置为其他值,ConcurrentHashMap会使用大于等于该值的最小2次幂指数作为实际并发度,但是一旦初始化后,它是不可以扩容的。在JDK8中是基于HashEntry(首节点)。JDK8中的..

2020-07-07 10:12:42 299

原创 HashMap

与HashTable的区别非同步,可为nullHashMap的性能影响因子初始容量(buckets的数量)和加载因子(扩容,时间和空间的计算)同步方法Map m = Collections.synchronizedMap(new HashMap(...));HashMap为什么要使用数组+链表(大于8转成红黑树)基于时间和空间的考虑:时间:数组查询快,链表插入快空间:数组内存区域连续,指定大小,具有随机访问性;链表内存可以存在任何地方,每个数据都保存了下一个数据的内存地..

2020-07-07 09:18:14 239

原创 并发编程初级篇

线程的解释线程是进程中的一个实体,脱离了进程,线程也不可能独立存在。进程是系统进行资源分配和调度的基本单位(比如QQ),线程则是进程的一个执行路径(比如QQ聊天线程,视频线程等),一个进程中至少有一个线程,进程中的多个线程共享进程的资源。虽然进程是系统进行资源分配和调度的基本单位,但是占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。进一步的,CPU一般是使用时间片轮转方式让线程轮询占用的,所以需要程序计数器来记录该线程让出CPU时的执行地址,待再次分配到时间片时线程就可以从自己的私有计..

2020-07-06 23:05:33 150

原创 重新认识java中的String对象

java底层实现细节JDK6由char[], hash, offset, value组成。JDK8private final char value[];// 该值用于字符存储。private int hash; // 缓存字符串的哈希码,默认为0。少了offset和count两个变量,占用内存少,同时String.subString方法也不再共享char[],从而解决了可能导致的内存泄漏问题。String对象的创建JVM创建对象简介:​ java中对象的创建都是在堆..

2020-07-06 14:59:36 511

原创 ArrayList与LinkedList

底层实现细节ArrayList底层使用动态数组,Linked底层使用的是双向链表。ArrayList的构造方法有3个:// 传入集合长度public ArrayList(int initialCapacity) { // 长度大于0则初始化对应长度大小的集合 if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; // 长度等于0则指定一个空集合 ..

2020-07-05 21:30:09 367

原创 Collection和Collections的区别

简介Collection是接口,抽象了集合向外暴露的一些方法,同时继承了Iterable迭代器模式。Collections是工具类,封装了常见对集合操作的方法。Collection常见方法 // 返回此集合中的元素数。如果此集合包含超过Integer.MAX_VALUE元素,则返回Integer.MAX_VALUE public int size(); // 如果此集合不包含任何元素,则返回true public boolean isEmpty(); // 如果此集合包..

2020-07-05 21:29:09 440

翻译 InputStream转换为String的11种方式

我发现了11种主要方法(请参见下文)。我写了一些性能测试(请参见下面的结果):将InputStream转换为字符串的方法:使用IOUtils.toString(Apache Utils)String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);使用CharStreams(Guava)String result = CharStreams.toString(new InputStreamReader( i

2020-07-05 21:21:42 4644

原创 RabbitMq中的消息传输保障

1,消息生产者需要开启事务机制或者确认机制来确保消息正确的到达了broker端。2,消息生产者需要配合使用mandatory参数或者备份交换器及死信队列来确保消息能够从交换器路由到队列中。3,消息和队列都需要进行持久化处理。4,消费者需要以手动确认的方式来确认已经正确消费的消息。...

2020-05-07 21:05:40 172

原创 windows中的Dos命令初览

一,原因最近在看Arachni的源码,发现bat脚本中的启动命令有些参数很难看懂,所以查了一下,特此记录。二,初步认识%0 代表文件本身d 代表盘符* 代表从第一个参数开始的所有参数 p 代表路径三,扩展认识引用变量用%var%,参数%0 具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等%~f0 - 完整的路径+文件名%~n...

2020-05-07 18:36:53 376

原创 Rabbit MQ中的消费端拒绝机制

Rabbit MQ的消费者拒绝机制有两种:单次拒绝Channel.basicReject(long deliveryTag, boolean requeue) throws IOException;其中deliveryTag为消息的编号,它是一个64位的长整型值。requeue参数设置为true,则Rabbit MQ会重新将这条消息存入队列,以便可以发送给下一个订阅的消费者;如果req...

2020-05-07 16:21:54 967

原创 AMQP中的生产者与消费者模型

一,AMQP协议简介Module Layer:位于协议的最高层,主要定义了一些客户端调用的命令,比如Queue.Declare(申明一个队列)和Basic.Consume(订阅消费一个队列中的消息)。Session Layer:位于协议的中间层,主要负责客户端与服务器端的交互,为其通信提供可靠的同步机制和错误处理。Transport Layer:位于协议的最底层,主要传输二进制数据流,提供...

2020-05-07 14:26:46 381

原创 Kafka的java客户端连接出现Connection refused: no further information

在正常配置zookeeper和kafka后,编写测试代码发现报错了:java.net.ConnectException: Connection refused: no further information at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.f...

2020-04-20 20:18:46 2332

原创 RabbitMq中的生产者确认机制

在使用RabbitMq的时候,可以通过消息持久化操作来解决服务器异常崩溃导致的消息丢失,但是如何保证消息正常到达RabbitMq呢?事务机制RabbitMq中与事务相关的操作一共有三个:channel.txSelect,channel.txCommit,channel.txRollback。channel.txSelect用于将当前信道设置为事务模式,channel.txCommit用于事务提...

2020-04-19 11:39:49 2064

原创 RabbitMq中的备份交换器与死信队列

之所以将两者放在一起比较,是因为两者都由一个共同的特点:当消息不能被正常消费或投递时的容错机制。备份交换器:未能正常路由的消息,又不希望因为添加mandatory参数提高编码的复杂性,此时即可使用备份交换器,在声明交换器时传入alternate-exchange参数,需要注意的是,发送到备份交换器的消息路由键与从生产者发送时的一致,所以如果备份交换器的类型不是fanout,就会存在消息丢失的可能...

2020-04-18 21:52:21 246

原创 RabbitMq中的过期时间(TTL)

RabbitMq中的过期时间一般针对于队列和消息。队列的过期时间声明队列时传入的x-expires参数可以控制队列在自动删除前未被使用的时间(单位为毫秒,不能设置为0),其自动删除需要满足以下三个条件:该队列没有任何消费者订阅该队列声明后未被重新声明该队列没有调用过Basic.Get RPC命令服务器会确保在过期时间到达后 队列被删除,但是不保证删除队列的动作有多么的及时。在brok...

2020-04-18 21:28:32 606

原创 RabbitMq中的mandatory

mandatory是在发送一条Basic.Publish RPC命令时一起传递的参数,告诉RabbitMq如果消息不可路由,应该通过Basic.Return RPC命令将消息返回给发布者。设置mandatory标志说明开启了消息故障检测模式,它只会让RabbitMq向你通知失败,而不会通知成功。进一步,当交换器根据自身和路由键无法找到合适的队列时,当mandatory设置为true,会通过Ba...

2020-04-18 20:48:51 2621

原创 RabbitMq中的autoAck与no-ack

《RabbitMq实战指南》中的autoAck与《深入RabbitMq》中的no-ack其实是同一个意思:借《深入RabbitMq》中的图例说明autoAck(同no-ack)为true的时候,消息发送到操作系统的套接字缓冲区时即任务消息已经被消费,但如果此时套接字缓冲区崩溃,消息在未被消费者应用程序消费的情况下就被队列删除。所以,如果想要保证消息可靠的达到消费者端,建议将autoAck...

2020-04-18 20:12:17 3591

原创 RabbitMq中的exclusive

RabbitMq中真正处理消息是队列,自然exclusive也只对队列生效。声明了exclusive属性的队列只对首次声明它的连接可见,并且在连接断开时自动删除(可以参考RabbitMq中的autoDelete)。有三点需要额外注意:针对连接可见,只要是当前connection下的信道都可以访问一旦该队列被声明,其他连接无法声明相同名称的排他队列。队列即使显示声明为durable,连接...

2020-04-18 19:05:12 8082 1

原创 RabbitMq中的durable

RabbitMq对交换器,队列,消息都可以声明持久化属性,交换器和队列持久化属性为durable(其属性值为false代表不持久化,属性值为true代表持久化),消息持久化属性为deliveryMode(其属性值为1代表不持久化,属性值为2代表持久化)。在说明durable之前,需要指出的是:1,RabbitMq实例以broker表示,当broker重启时,所有未申明durable的交换器和队...

2020-04-18 17:59:26 11579

原创 RabbitMq中的autoDelete

RabbitMq在声明交换器和队列时,都有一个共同的属性为autoDelete,从字面意思上来说可以理解为自动删除,那么自动删除的前提是什么呢?抛开代码本身来说,从设计者的角度来思考,一个交换器或者一个队列在什么时候需要被自动删除呢?当然是该交换器或队列不被需要了,即交换器下曾经绑定过的交换器或队列解除绑定,队列下的消费者解除订阅。但是,一个交换器如果从来未曾被任何交换器/队列绑定过,一个队...

2020-04-18 17:34:47 7804 1

原创 Mysql面试官系列:如何优化因为MySQL引起的CPU消耗过大?

有一天,小明去面试:面试官:如何优化因为MySQL引起的CPU消耗过大?小明:额,加索引,加缓存?面试官:还有吗?小明开始深呼吸了,犹豫道:分表?面试官:为什么分表能解决CPU消耗过大?小明支支吾吾的说道:因为减少数据量了,所以单次查询消耗的CPU会少一点。面试官皱起眉头:除了加索引,加缓存,分表以外,还有什么可以优化的地方嘛?小明苦思冥想:避免使用函数,代码跟sql数据类型保持一...

2020-04-17 14:58:06 258

原创 以开发的角度重新认知消息中间件——起源简介

一,消息消息,message,对于开发来说,也是应用程序消费的数据,消息可以非常简单,文本字符串,JSON,XML等,也可以很复杂,比如内嵌对象,图片,视频等。二,消息与消息中间件对于消息中间件来说,消息本身的复杂程度被其屏蔽,消息队列中间件(Message Queue Middleware,简称MQ)利用高效可靠的消息传递机制进行平台无关的数据交流(有没有想到Java虚拟机),并基于数据通...

2020-04-17 13:50:21 218

原创 maven学习篇之maven-shade-plugin

maven-shade-plugin简介“This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies.”,这句话...

2020-01-02 15:37:04 2358

翻译 Apache Shiro与Web整合

配置web.xmlShiro 1.2及以后自定义WebEnvironment类自定义配置位置Shiro 1.1及更早版本自定义路径内联配置Web INI配置[urls]URL路径表达式过滤链定义可用过滤器默认过滤器会话管理Servlet容器会话Servlet容器会话超时原生会话Defa...

2019-07-15 15:45:57 199

翻译 Shiro中的Realm详解

Realm配置明确的分配 隐含分配 Realm认证 支持AuthenticationTokens 处理支持的AuthenticationTokens 凭证匹配 简单的相等性检查 哈希证书哈希和相应的匹配者 SaltedAuthenticationInfo 禁用身份验证 Realm授权 基于角色的授权 基于权限的授权一个Realm...

2019-07-15 11:59:47 1326

翻译 深入理解Apache Shiro中的“Permissions”概念

Shiro将Permission定义为定义显式行为或操作的语句。它是应用程序中原始功能的声明,仅此而已。权限是安全策略中最低级别的构造,它们只显式定义应用程序可以执行的操作。他们根本没有描述“谁”能够执行行动((而不是描述who对what(which)进行how操作))。一些权限示例:打开一个文件查看“/ user / list”网页打印文件删除’jsmith’用户定义“谁”(用户...

2019-07-12 15:53:52 816

翻译 Shiro中的权限访问控制

授权要素权限权限粒度角色用户授权对象基于代码授权基于角色的授权角色检查角色断言基于权限的授权权限检查基于对象的权限检查基于字符串的权限检查权限断言基于注解的授权配置RequiresAuthentication注释RequiresGuest注释RequiresPermissions注释RequiresRoles权限R...

2019-07-12 13:08:45 1103

空空如也

空空如也

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

TA关注的人

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