- 博客(76)
- 资源 (3)
- 收藏
- 关注
原创 使用 Apache POI 实现 Java Word 模板占位符替换功能
通过 Apache POI,Java 程序可以非常方便地处理 Word 文档的占位符替换问题。本文介绍了如何使用 Apache POI 读取 Word 模板、替换占位符并生成新的文档。对于一些简单的文档生成场景,这种方法非常直观且高效。但如果文档结构较为复杂(如需要动态插入表格或图片),则可能需要对代码进行更进一步的优化。Apache POI 提供了对 Word 文件的细粒度控制能力,适合在复杂的办公文档生成场景下使用。
2024-09-09 22:29:10
2781
原创 如何有效防止重复提交表单
防止重复提交是企业级项目中常见的挑战,尤其是在高并发的场景下。本文介绍了多种防重策略,从前端的简单按钮控制,到后端的分布式锁、消息队列以及幂等性API设计等,这些方法可以根据具体业务需求进行灵活组合使用。在实际项目中,企业通常会结合这些方法来设计防重机制,以确保系统的高效运行和数据的一致性。希望本文提供的思路能为大家在实际开发中解决重复提交问题提供一些参考和帮助。
2024-09-06 16:41:25
1293
原创 使用Spring Boot拦截器实现时间戳校验以防止接口被恶意刷
通过Spring Boot的拦截器,我们可以非常方便地在所有请求之前进行时间戳校验。这种通用的解决方案不仅提高了系统的安全性,而且易于维护和扩展。您可以根据实际需求对校验算法进行调整和优化,确保接口的安全性。希望本文能对你在防止接口被恶意刷请求方面提供一些有用的思路和参考!
2024-09-03 15:37:16
1455
1
原创 GraphQL入门教程:构建更高效的APIs
在目录下创建.graphqls文件定义GraphQL模式。例如,): User): Booleanage: Intid: ID!age: Int。
2024-04-02 17:15:01
870
原创 react useMemo的使用
useMemo是 React 提供的一个钩子(Hook),用于优化性能,特别是在处理复杂的函数或计算密集型操作时。useMemo通过记住(缓存)一个函数的返回值来减少不必要的重复计算。当您使用useMemo时,只有当其依赖项发生变化时,才会重新计算这个记忆值。
2023-12-21 09:57:49
1017
原创 mysql8 修改数据存储位置
默认情况下,MySQL的数据库目录位于/var/lib/mysql。假设您想将数据库目录更改为/home/mysql,您可以使用以下命令来复制数据库目录。用下面的命令将原目录的selinux权限赋给新的目录。检查对比一下原目录和新目录的selinux权限。
2023-09-01 15:54:23
2904
原创 centos 定时脚本检测tomcat是否启动,未启动情况下重新启动
【代码】centos 定时脚本检测tomcat是否启动,未启动情况下重新启动。
2023-08-10 21:09:59
1352
原创 guava报错 java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.of
同时删除本地maven仓库 com\google\collections\google-collections,不然还会报错。解决方法:首先查找pom文件是否引用冲突,删除 google-collections 依赖。在使用guava时 报错。
2023-06-05 22:54:38
1121
原创 antd Upload组件上传状态一直处于uploading
antd Upload组件上传状态一直处于uploading对于受控模式,需要在 onChange 中始终 setState fileList,保证所有状态同步到 Upload 内import { UploadFile, UploadProps } from 'antd/es/upload/interface';...const [fileList, setFileList] = useState<UploadFile[]>([]);const uploadProps: Uplo
2022-01-13 15:59:59
6433
原创 使用useRef解决useState异步更新数据导致更新不及时问题
由于react hooks中useState更新值是异步的,所以会出现值更新不及时,可以使用useRef来解决这个问题定义useCallbackState函数import { useState, useRef, useEffect } from 'react';export function useCallbackState(state: any) { const cbRef = useRef(); const [data, setData] = useState(state);
2021-12-28 17:25:34
5010
原创 react antd使用TinyMCE富文本编辑器
1、引入tinymcenpm install --save @tinymce/tinymce-react2、将tinymce的文件放在public目录下 tinymce下载地址:https://www.tiny.cloud/get-tiny/self-hosted/ 语言包下载地址:https://www.tiny.cloud/get-tiny/language-packages/ 语言包下载后放在tinymce\js\tinymce\langs下3、自定义组件import { Edi
2021-12-28 13:17:01
2104
原创 windows下配置nginx开机自启
先从官网下载nginx,解压到E:\nginx下载 Windows Service Wrapper工具,该工具可设置nginx为Windows服务,下载链接选择相应版本,这里选择了2.9.0 net4版本将下载的WinSW.NET4.exe放在E:\nginx目录下,并改名成nginx-service.exe,然后分别创建nginx-service.exe.config,nginx-service.xml文件,把这两个文件放在Nginx安装目录下nginx-service.exe.c..
2021-09-15 16:12:48
401
原创 centos7安装harbor2.0
安装docker安装依赖包yum -y install yum-utils device-mapper-persistent- data lvm2添加yum源yum-config-manager \--add-repo \ https://download.docker.com/linux/centos/docker-ce.repo安装 Docker 服务# 查询docker版本yum list docker-ce --showduplicates|sort -r
2021-09-15 15:56:28
442
原创 vue中解决 Cannot read property ‘stylus‘ of undefined 报错问题
安装stylus和stylus-loader版本如下//版本如下"stylus": "^0.54.8","stylus-loader": "^3.0.1",项目启动报错TypeError: Cannot read property 'stylus' of undefined at Object.module.exports (F:\项目目录\node_modules\stylus-loader\index.js:29:37)查看stylus-loader\index.js:29:37
2021-06-15 22:48:09
5664
4
原创 vue v-for数据循环实现每n项一分组换行
v-for 循环 实现每n项一分组换行<table> <tr v-for="(row,index) in sliceList(list,4)" :key="index"> <td v-for="(item,i) in row" :key="i"> {{item.attrA}} </td> </tr></table
2021-05-11 10:22:21
6477
3
原创 mysql数据库定时备份
1.创建数据库备份脚本先创建备份文件目录mkdir /usr/local/mysqlbackup在/usr/local目录下创建mysql_dump_script.sh脚本vim mysql_dump_script.sh#!/bin/bash. /etc/profile. ~/.bash_profile#保存备份个数,备份31天数据number=31#备份保存路径backup_dir=/usr/local/mysqlbackup#日期dd=`date +%Y-%m-%d-%
2021-01-20 00:26:15
194
1
原创 解决MySQL ERROR 1045 (28000)
在使用navicat连接数据库时,报错信息:MySQL ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES),解决方法:1、修改mysql的登录设置vim /etc/my.cnf并在[mysqld]下面添加一句:skip-grant-tables(跳过数据库权限验证)保存并退出重启mysql并修改密码/etc/init.d/mysqld restart进入mysql[root
2021-01-19 22:07:03
249
原创 布隆过滤器的实现应用
概念布隆过滤器主要用于缓存穿透,一般我们会把数据放在Redis里缓存,请求过来先读缓存,有缓存的话直接返回,如果缓存中没有,再去访问数据库查询,然后再把数据库读取的数据放入缓存。但是如果有大量请求过来,而且都在访问一个不在缓存里的数据,这时这些大量请求都会到数据库,对数据库造成很大压力。可以用很多办法来解决这个问题,如分布式锁、布隆过滤器。布隆过滤器可以缓解缓存穿透问题,问什么说是缓解,而不是解决呢?这是因为布隆过滤器会有一定的误判率。布隆过滤器(Bloom Filter)本质上是由长度为 m 的位向
2021-01-11 15:44:25
683
原创 Redis的数据类型 - set、sorted_set
set保存多个字符串元素,但不允许有重复的元素,并且集合set是无序的,不能通过索引下标获取元素set除了基本的增删改查,还支持多个集合的取交集、并集、差集等操作,下面来看一下命令help @setsaddSADD key member [member ...]summary: Add one or more members to a setsince: 1.0.0添加元素127.0.0.1:6379[1]> del k1 (integer) 1127.0.0.1:6379[1
2020-12-15 23:56:42
525
原创 Redis位图Bitmaps详解
概念Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作。可以把Bitmaps想象成一个以位为单位的数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。例如字符串A 一个字节,对应的ASCII码是65,对应的二进制就是01000001,Bitmaps就是对A的二进制位进行操作。命令SETBIT
2020-12-09 00:16:16
876
2
原创 Redis的数据类型 - string、hash、list
字符串类型可以是字符类型、数值类型、bitmaps可以通过help @string 查看string相关命令SETset key value [expiration EX seconds|PX milliseconds] [NX|XX]设置值命令EX seconds:为键设置秒级过期时间PX milliseconds:为键设置毫秒级过期时间NX:键必须不存在,才可以设置成功,用于添加、分布式锁XX:与NX相反,键必须存在,才可以设置成功,用于更新例:set name hello
2020-12-07 23:43:54
236
原创 linux安装redis
yum -y install wgetcd /home/softwarewget https://download.redis.io/releases/redis-6.0.9.tar.gztar -zxvf redis-6.0.9.tar.gzcd redis-6.0.9.tar.gzyum -y install gccmake && make install PREFIX=/usr/local/redis如果报以下错误 structredi..
2020-12-07 17:21:48
166
原创 常用Java虚拟机参数
打印GC日志-XX:+PrintGCjdk9之后建议使用 -Xlog:gc[GC (Allocation Failure) 4676K->2628K(9728K), 0.0004307 secs][GC (Allocation Failure) 4676K->2628K(9728K), 0.0004717 secs][GC (Allocation Failure) 4676K->2628K(9728K), 0.0006033 secs][GC (Allocation F
2020-11-28 22:50:28
502
原创 JVM 方法区详解
栈、堆、方法区的交互关系从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理下面就涉及了对象的访问定位Person:存放在元空间,也可以说方法区person:存放在Java栈的局部变量表中new Person():存放在Java堆中方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方
2020-11-28 22:47:55
289
原创 JVM 堆(heap)详解
堆的核心概念堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allo
2020-11-28 22:10:23
1368
原创 java四种引用类型(强引用 软引用 弱引用 虚引用)
强引"/;.l,“?:> k”强引用就是程序中一般使用的引用类型,强引用的对象是可触及的,不会被回收。强引用可以直接访问目标对象强引用所指向的对象在任何时候都不会被系统回收,虚拟机宁愿抛出OOM异常,也不会回收强引用所指的对象强引用可能会导致内存泄漏软引用如果一个对象只持有软引用,那么当堆空间不足时,就会被回收。软引用使用java.lang.ref.SoftReference类实现。下面演示软引用在堆内存不足的情况下被回收public class SoftRef {
2020-11-28 21:01:52
139
原创 JVM 本地方法接口、本地方法栈
本地方法接口什么是本地方法本地方法是一个非Java的方法,它的具体实现是非Java代码的实现在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。代码举例说明Native方法是如何编写的public class IhaveNatives { public native void Native1(int x);
2020-11-28 18:22:52
119
原创 JVM虚拟机栈
虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。首先栈是运行时的单位,堆是存储的单位栈解决程序如何执行,如何处理数据堆解决的是数据存储问题,即数据怎么放,放在哪里Java虚拟机栈,早期也叫Java栈,每个线程创建时都会创建一个虚拟机栈,内部保存一个个栈帧,对应着一次次方法调用,生命周期和线程的一致,主管Java程序的运行,它保存方法的局部
2020-11-28 18:19:09
145
原创 JVM垃圾回收相关算法
GC的垃圾特指存在内存中的、不会被使用的对象,对这些垃圾回收,这样内存就会有区域被腾出来,如果大量不会被使用的对象一直占用空间,就会导致内存溢出。java是虚拟机负责垃圾回收,开发效率高,执行效率低,C++手工处理垃圾,容易忘记回收,内存泄漏回收多次非法访问开发效率低、执行 效率高引用计数法(Reference Couting)引用计数法的实现比较简单,就是一个对象,有几个引用指向了它,它的引用计数器就是几,当变成0是,就是没有任何一个引用指向它,这个对象就不可能再被使用。但是引用计数
2020-11-28 18:14:17
126
原创 对象的创建过程、内存布局、定位、分配
对象的创建过程当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否加载、解析和初始化过。如果没有,先将class loading到内存linking过程:verification校验,preparation把类的静态变量设默认值,resolution将符号引用解析成直接引用intializing初始化,把类的静态变量设为初始值并执行静态代码块分配内存指针碰撞(Serial、ParNew等
2020-11-23 01:05:41
234
原创 MESI缓存一致性协议 伪共享 合并写 有序性 内存屏障
CPU Cache与Memory关系图先看一张存储器的层次结构图现在的处理器都是多核处理器,并且每个核都带有多个缓存,为什么需要缓存,是因为cpu的速度特别快,比内存快100数量级,所以在cpu与内存之间加了个缓存用来提高访问速度。现在假如有一个数在内存里,这个数他会被load到 L3缓存上,L1和L2是在CPU的内部的,这时候会产生一个情况,L3或者主存里面这个数会被load不同的cpu的内部,这个时候如果把cpu1的x修改成1,cpu2的x修改成2,就会产生数据不一致问题,多核同时访问同一个变量时
2020-11-22 12:12:06
580
原创 单例模式下为什么一定要加volatile关键字
有一道面试题,单例模式已经双重检查锁定(Double-Check-Lock)了,要不要加volatile关键字。以下是双重检查锁定来实现单例模式代码public class DoubleCheckLock { private static DoubleCheckLock INSTANCE; private DoubleCheckLock() { } public static DoubleCheckLock getInstance() { if (I
2020-11-19 00:42:07
1385
2
原创 使用ASM框架实现统计函数执行时间
定义ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。实现现在使用ASM框架,在不修改源代码的情况下实现统计函数执行
2020-11-18 22:31:37
813
原创 深入理解Class文件结构
深入理解Class文件结构概述我们都知道编写的Java的源码会先编译成Class文件,java虚拟机再将Class文件解释编译成对应平台的机器指令,所以能够解析Class文件的数据结构是非常有必要的。先编写一段java源码,定义一个类并实现一个接口,类内部定义了一个成员变量、一个类变量和一个sum方法。package com.changyy.jvm;public class Class...
2020-11-03 20:21:13
58
原创 从一个class文件深入理解Class文件结构
深入理解Class文件结构概述我们都知道编写的Java的源码会先编译成Class文件,java虚拟机再将Class文件解释编译成对应平台的机器指令,所以能够解析Class文件的数据结构是非常有必要的。先编写一段java源码,定义一个类并实现一个接口,类内部定义了一个成员变量、一个类变量和一个sum方法。package com.changyy.jvm;public class ClassTest implements IClassTest { private int n = 10
2020-11-03 17:03:34
479
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人