
后端
文章平均质量分 75
得过且过的勇者y
万丈高楼平地起,勿在浮沙筑高台
展开
-
JSON和Protobuf序列化
因为像TCP和UDP这种底层协议只能发送字节流,因此当我们在开发一些远程过程调用(RPC)的程序时,需要将应用层的Java POJO对象序列化成字节流,数据接收端再反序列化成Java POJO对象。理论上对于性能要求不是太高的服务器程序可以选择JSON系列的序列化框架,而对于性能要求较高的服务器程序则应该选择传输效率更高的二进制序列化框架如Protobuf。原创 2023-10-30 22:49:18 · 1795 阅读 · 1 评论 -
Reactor反应器模式
这种模式的优点是解决了前面的新连接被严重阻塞的问题,在一定程度上极大地提高了服务器的吞吐量。而且线程的反复创建、销毁、线程的切换也需要代价。这种方法最大的问题就是如果前一个网络连接的处理没有结束,那么后面的连接请求没法被接收,于是后面的请求统统会被阻塞住,服务器的吞吐量就太低了。在单线程反应器模式中,Reactor反应器和Handler处理器都执行在同一条线程上(dispatch方法是直接调用run方法,没有创建新的线程),因此当其中某个Handler阻塞时,会导致其他所有的Handler都得不到执行。原创 2023-10-24 22:12:37 · 632 阅读 · 0 评论 -
接口幂等性
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现。这是来自百度百科的解释,讲人话幂等性就是指。...原创 2022-07-18 09:09:03 · 387 阅读 · 1 评论 -
API接口签名验证
但是这样的验证方式存在有一定的问题,如果token被泄露被他人获取,那么就会有非法请求的风险。只需要服务端与客户端约定一套密钥,客户端在发送请求时拼接上私钥后使用单向加密算法进行加密,服务端收到后使用相同的私钥和加密算法进行加密后验证是否与前端客户端传递的值相同。以上方式虽然解决了非法用户请求和请求参数被篡改的问题,但是还存在着重复使用请求参数伪造二次请求的隐患。为了防止这种情况的发生,我们验证接收到的数据与客户端发送的数据一致,且让接口只能被客户端请求。原创 2023-03-01 18:13:55 · 5002 阅读 · 1 评论 -
SpringBoot整合Redis调用lua脚本出现空指针异常(序列化器问题)
而之所以存储的时候会带上双引号是因为我使用的是自定义的redisTemplate进行插入,key和value的泛型都设置为了string类型,并且在定义该类时选用了。首先我尝试直接在代码中进行调试,尝试获取redis.call中get的值是什么,结果发现print语句输出的结果并不会出现在控制台。仔细观察第一次运行输出的值,我们不难发现这其实是带双引号的1而且双引号被转移导致了无法调用tonumber。那么到这里就很清楚了,因为redis中存储的值并不能直接转换为数字,所以出现了空指针异常。原创 2023-03-01 14:48:11 · 1333 阅读 · 0 评论 -
SpringMVC控制层private方法中出现注入的service对象空指针异常
private方法并没有被真正的代理类拦截(如前面所说被过滤了),因此private方法无法获取被代理的对象,所以使用的是代理对象去调用的方法,而代理对象是由Cglib创建的并没有注入bean对象,所以出现了空指针异常。而当调用被增强了的方法(即在代理类中重写了的方法)时,其实传入的并非代理的实例对象,而是target,即被代理的Bean的实例对象,所以才能取得service层的bean。因为没有AOP增强的private方法是正常的,所以我们可以联想到可能是因为创建了代理对象的原因导致的属性为空。原创 2023-02-28 23:18:55 · 1630 阅读 · 0 评论 -
微服务架构入门
微服务架构在某种程度上是SOA继续发展的产物,它更强调服务的彻底拆分,较SOA粒度更精细,每个服务之间互不影响,必须独立部署,更加轻巧。SOA架构数据库存储可能会共享,而微服务强调每个服务都是单独数据库,保证每个服务与服务之间互不影响。较SOA架构更适合互联网公司敏捷开发,快速迭代版本,因为力度非常精细。当垂直应用越来越多,重复的业务代码就会越来越多,这时候将重复的代码抽取出来,做成统一的业务层作为独立的服务,然后由控制层调用不同的业务层服务,这就是分布式系统架构。它把工程拆分成表现层和服务层两个部分原创 2022-10-26 15:16:45 · 262 阅读 · 0 评论 -
Java维护常量方式的比较——接口、常量类与枚举
而对于枚举,参数接收的是枚举中定义的静态对象(即传入的就是事先存在的、枚举中的对象),即常量值地址唯一(因为其构造函数是私有的,无法通过外部构造出对象),所以只要比较地址即可。而处于不同地址的两个对象是可以相同的,所以对于常量来说,用户传入的参数是自己写的(新创建的)常量,与常量类中定义的常量显然是不同的对象,所以要比较的是内容是否相同而非地址。每个枚举都是通过Class在内部实现的,且所有的枚举值都是publicstaticfinal的。常量能做的,枚举都能做,枚举能做的常量不一定能做。......原创 2022-07-20 15:45:12 · 1434 阅读 · 4 评论 -
全局唯一ID(自增ID、UUID、雪花算法)
系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中,几乎都需要对大量的数据和消息进行唯一标识。在设计初期,我们需要考虑日后数据量的级别,如果可能会对数据进行分库分表,那么就需要有一个全局唯一id来标识一条数据或记录。生成唯一id的策略有多种,但是每种策略都有它的适用场景、优点以及局限性。id一般是数据库的主键,数据库上会建立聚集索引,即在物理存储上以这个字段排序。这个记录标识上的查询往往又有分页或者排序的业务需求,如果再增加一个time字段以其建立普通索引则访问效率低(因为普通索引存储的是实际原创 2022-07-09 21:52:46 · 6681 阅读 · 0 评论 -
SpringBoot基础
文章目录一、SpringBoot配置1、配置文件2、给属性赋值的几种方式3、多环境配置及配置文件位置4、整合其他框架1)整合Junit2)整合redis3)整合MyBatis二、SpringBoot自动配置1、condition2、切换内置Web服务器3、Enable*注解4、自动装配原理三、SpringBoot监听机制1、事件监听2、监控使用3、Spring Boot Admin四、SpringBoot Web开发1、静态资源导入2、Thymeleaf模板引擎五、SpringBoot项目部署2、Thyme原创 2022-05-18 23:08:43 · 361 阅读 · 0 评论 -
Spring+SpringMVC+Mybatis入门
一、Spring1、Spring环境搭建调整项目环境修改JDK版本修改单元测试版本删除build标签中pluginManagement标签添加Spring框架的依赖坐标添加Spring配置文件2、SpringIOC的Bean对象实例化模拟1)定义Bean属性对象package cn.ken.virtual_ioc;/** * myBean对象 * 用来接收配置文件中bean标签的id和class属性值 */public class MyBean { priva原创 2022-05-18 22:56:10 · 1415 阅读 · 0 评论 -
Spring入门
一、Spring配置文件1、Bean标签基本配置用于配置对象交由Spring来创建默认情况下它调用的是类中的无参构造函数,如果没有则不能创建成功基本属性:id:Bean实例在Spring容器中的唯一标识class:Bean的全限定名称2、Bean标签范围配置scope指的是对象的作用范围1)当scope的取值为singleton时:Bean的实例化个数:1个Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例Bean的生命周期:对象创建:当应用加原创 2022-05-18 22:50:22 · 227 阅读 · 0 评论 -
SpringBoot Jackson Date类型格式设置
SpringBoot Jackson Date类型格式设置一、背景说明在使用SpringBoot+SpringMVC时,默认采用Jackson包来进行JSON转换。在返回Date类型的数据时,Jackson会以时间戳的形式返回,而实际场景往往需要以yyyy-MM-dd HH:mm:ss这类日期或时间格式返回。二、解决方案有几种方式可以对Date格式进行设置:在application.properties中做全局配置spring.jackson.date-format=yyyy-MM-dd原创 2022-05-10 20:48:38 · 5417 阅读 · 0 评论 -
SpringBoot项目Http406错误问题解决
一、背景1、自定义了返回类2、控制器使用@ResponseBody注解标记不加@ResponseBody的话会将方法返回的值作为视图名称,并自动匹配视图去显示,而加上@ResponseBody就仅仅是将方法返回值当作内容直接返回到客户端,并且会自适应响应头的content-type,返回的字符串符合json,那么content-type就是application/json,如果是普通字符串,就是text/plain,但是加上注解属性produces=application/json,那么不管内容是什原创 2022-05-10 20:28:23 · 4265 阅读 · 2 评论 -
CORS跨域请求出现问题
1、问题描述Access to XMLHttpRequest at ‘http://localhost:8080/user/register’ from origin ‘http://localhost:8002’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: The value of the ‘Access-Control-Allow-Origin’ h原创 2022-04-19 00:54:49 · 1709 阅读 · 0 评论 -
JavaMailSender发送邮件(整合SpringBoot、解决空指针异常问题)
一、邮箱开启SMTP服务以qq邮箱为例进入邮箱设置页面后选择账户移动至下方的POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务选择开启IMAP/SMTP服务,并获得授权码二、导入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId>原创 2022-04-16 17:32:29 · 5245 阅读 · 0 评论 -
全局异常处理
全局异常处理@ControllerAdvice注解:不写参数:所有Controller参数为包名:包下的所有Controller,可指定多个如:@ControllerAdvice(basePackages={"cn.ken.test1", "cn.ken.test2"})参数为注解:可以自定义注解后匹配所有加了该注解的Controller,如:@ControllerAdvice(annotations={MyAnnotation.class})此注解是一个在类上声明的注解,是aop思想的一种原创 2022-04-10 22:00:31 · 296 阅读 · 0 评论 -
SpringBoot2.6整合Swagger2(附易踩坑点:运行报错/访问404)
一、引入依赖<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version></dependency><dependency> <groupId>io.springfox</groupI原创 2022-04-10 21:41:05 · 6318 阅读 · 8 评论 -
JWT技术--JSON Web Token
一、JWT简介JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。使用方式:服务端根据规范生成一个令牌(token),并且发放给客户端(保存在客户端)。此时客户端请求服务端的时候就可以携带者令牌,以令牌来证明自己的身份信息。作用:类似session保持登录状态的办法,通过token来代表用户身份。Authorization (授权) : 这是使用J原创 2022-04-07 01:19:52 · 12131 阅读 · 0 评论 -
解决required a single bean, but 2 were found问题
解决required a single bean, but 2 were found问题背景:springboot整合shiro中自定义Realm时出现错误描述Parameter 0 of method getDefaultWebSecurityManager in cn.ken.springboot_shiro.config.ShiroConfig required a single bean, but 2 were found:getRealm: defined by method ‘get原创 2022-03-30 00:45:26 · 3229 阅读 · 0 评论 -
SpringBoot整合七牛云实现文件上传
七牛云文件上传1、引入Maven依赖<dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>[7.7.0, 7.7.99]</version></dependency>2、配置yaml文件qiniu: accessKey: 2mz0xTvAym2Az原创 2022-03-21 17:17:04 · 1352 阅读 · 2 评论 -
Maven配置文件修改
Maven的配置文件位于conf目录下的settings.xml文件1、添加镜像下载地址原因:解决默认仓库下载速度堪忧的问题(服务器在国外)在配置文件中找到<mirrors>标签,在默认镜像仓库下添加如下信息:<!-- 阿里云镜像 --><mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.原创 2021-11-24 17:34:54 · 3478 阅读 · 0 评论 -
Maven集成Tomcat插件+远程热部署项目
插件和依赖的区别:依赖:运行时开发时都需要用到的jar包,比如项目中需要一个Json的jar包,就要添加一个依赖,这个依赖在项目运行时也需要,因此在项目打包时需要把这些依赖也打包进项目里;插件:在项目开的发时需要,但是在项目运行后就不再需要,因此在项目开发完成后不需要把插件打包进项目中,例如接下来演示的Tomcat插件就是用来部署Web项目的,部署成功使用Maven集成Tomcat插件的原因常规模式使用Tomcat服务器需要本地有tomcat服务器,且如果需要适配不同版本的jdk或servlet.原创 2021-11-24 01:58:20 · 937 阅读 · 1 评论 -
Tomcat与Servlet、JSP、JDK的版本适配问题(解决访问出现404和500的问题)
文章目录一、问题描述二、出现原因三、解决方法1、降低Tomcat版本2、提高Servlet版本四、相关内容一、问题描述最近在学习Maven创建Java Web项目的过程中,出现了配置Servlet后访问出现404和500的问题,如下二、出现原因在网上查了许多资料之后,我发现这是因为Tomcat版本的适配问题。在Tomcat的官网https://tomcat.apache.org/whichversion.html中,我们可以看到不同版本的Tomcat适配的JDK、Servlet、Jsp以及EL原创 2021-11-23 12:04:13 · 10525 阅读 · 3 评论 -
Java-Servlet技术入门笔记
文章目录一、Servlet技术1、什么是Servlet2、手动实现Servlet程序3、通过注解配置访问路径url-pattern4、url地址到Servlet程序的访问5、Servlet的生命周期6、GET和POST请求的分发处理7、通过继承HttpServlet实现Servlet程序8、使用IDEA创建Servlet程序9、Servlet的继承体系二、ServletConfig类1、ServletConfig类的三大作用2、注意事项三、ServletContext类1、什么是ServletContext原创 2021-11-07 17:15:27 · 1064 阅读 · 0 评论 -
通过读取配置文件数据获取数据库连接(如何获取资源文件输入流)
一、好处实现了数据和代码的分离,解耦编写的java程序部署到服务器上时,需要打包,如果java代码修改过,就需要重新打包;而使用配置文件则不需要修改代码,所以不用重新打包。二、实现方式在src目录下新建一个.properties文件获取资源文件的输入流。获取配置文件中的信息连接数据库 static { Properties pros = new Properties(); InputStream is = ClassLoader.getSystemCl原创 2021-11-02 18:09:18 · 975 阅读 · 0 评论 -
Tomcat部署项目的方法
Tomcat部署项目的方法http://ip:port/工程路径/资源路径以项目名称是hello为例,以下方法部署后通过http://localhost:8080/hello即可访问工程项目(没有填写资源路径,默认访问hello目录下的index.html文件)一、直接将项目放到webapps目录下工程路径即为项目文件夹的名称简化部署:将项目打成一个war包,再将war包放置到webapps目录下,war包会自动解压缩(Tomcat启动时)由于此法需要项目部署在webapps目录,这原创 2021-10-30 20:15:10 · 358 阅读 · 0 评论 -
Servlet技术入门(视频学习笔记)
一、Servlet技术1、什么是ServletServlet是JaveEE规范之一,规范就是接口Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送来的请求,并响应数据给客户端2、手动实现Servlet程序编写一个类去实现Servlet接口实现service方法,处理请求,并响应数据到web.xml中去配置程序的访问地址package com原创 2021-10-30 19:56:19 · 225 阅读 · 1 评论 -
web工程部署路径与getServletConfig().getRealPath()
我们都知道,通过ServletContext类可以获取工程路径(虚拟路径)以及工程部署在服务器硬盘上的绝对路径那我们首先应该了解一个工程是怎样部署的,以idea为例不知道大家有没有发现每当我们启动服务器时,都会有这样一个地址这是一个什么地址呢,我们打开发现它的目录内容如下有没有熟悉感?我们对比一下Tomcat的目录发现了吗,这个路径其实就是IDEA整合Tomcat之后,Tomcat被拷贝的一些副本内容。进入这个地址的conf/Catalina/localhost目录,我们发现了这样一个文件原创 2021-10-28 14:13:46 · 473 阅读 · 0 评论