首页
归档
友链
关于
Search
1
网易云音乐黑胶会员月月免费赠送
3,120 阅读
2
十年之约RSS聚合订阅服务上线
2,611 阅读
3
工资发放日的区别
2,355 阅读
4
rsyslogd内存占用过高解决方案
2,239 阅读
5
Nginx反代MinIO后,上传文件签名异常
2,133 阅读
零碎
标本
码海
工具
其他
登录
Search
标签搜索
北京
摄影
Java
旅行
生活
学习笔记
教程
Linux
服务器
软件
SpringBoot
日记
Windows
服务
数据库
福利
Spring
系统
SQL
前端
萧瑟
累计撰写
191
篇文章
累计收到
1,282
条评论
首页
栏目
零碎
标本
码海
工具
其他
页面
归档
友链
关于
搜索到
191
篇与
萧瑟
的结果
2022-01-03
2022.01.03碎碎念
日常碎碎念,简单记录点滴生活,算是写的一些流水账吧。
2022年01月03日
493 阅读
10 评论
2022-01-02
2022年元旦再临八达岭长城
2022年元旦,再次登顶八达岭长城,新年第一天就要做个好汉。
2022年01月02日
516 阅读
7 评论
2021-12-13
SpringBoot AOP日志切面
AOP切面AOP(Aspect-Oriented Programming,面向切面编程),它利用一种”横切”的技术,将那些多个类的共同行为封装到一个可重用的模块。便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。AOP相关概念Aspect(切面):声明类似于Java中的类声明,在Aspect中会包含一些Pointcut及相应的Advice。Joint point(连接点):表示在程序中明确定义的点。包括方法的调用、对类成员的访问等。Pointcut(切入点):表示一个组Joint point,如方法名、参数类型、返回类型等等。Advice(通知):Advice定义了在Pointcut里面定义的程序点具体要做的操作,它通过(before、around、after(return、throw)、finally来区别实在每个Joint point之前、之后还是执行 前后要调用的代码。Before:在执行方法前调用Advice,比如请求接口之前的登录验证。Around:在执行方法前后调用Advice,这是最常用的方法。After:在执行方法后调用Advice,after、return是方法正常返回后调用,after\throw是方法抛出异常后调用。Finally:方法调用后执行Advice,无论是否抛出异常还是正常返回。AOP proxy:AOP proxy也是Java对象,是由AOP框架创建,用来完成上述动作,AOP对象通常可以通过JDK dynamic proxy完成,或者使用CGLIb完成。Weaving:实现上述切面编程的代码织入,可以在编译时刻,也可以在运行时刻,Spring和其它大多数Java框架都是在运行时刻生成代理。代码示例POM引入<!-- SpringBoot Aop组件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- 分析客户端信息的工具类--> <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUtils</artifactId> <version>1.21</version> </dependency>切面:LogAspect代码/** * 添加aop日志打印 * * @author yanqs * @date 2020/1/13 14:42 */ @Aspect @Component @Slf4j public class LogAspect { /** * 进入方法时间戳 */ private Long startTime; /** * 方法结束时间戳(计时) */ private Long endTime; public LogAspect() { } /** * 定义请求日志切入点,其切入点表达式有多种匹配方式,这里是指定路径 */ @Pointcut("execution(public * com.springboot.logaop.controller.*.*(..))") public void logPointcut() { } /** * 前置通知: * 1. 在执行目标方法之前执行,比如请求接口之前的登录验证; * 2. 在前置通知中设置请求日志信息,如开始时间,请求参数,注解内容等 * * @param joinPoint * @throws Throwable */ @Before("logPointcut()") public void doBefore(JoinPoint joinPoint) { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //获取请求头中的User-Agent UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); //打印请求的内容 startTime = System.currentTimeMillis(); log.info("请求开始时间:{}", LocalDateTime.now()); log.info("请求Url : {}", request.getRequestURL().toString()); log.info("请求方式 : {}", request.getMethod()); log.info("请求ip : {}", request.getRemoteAddr()); log.info("请求方法 : ", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); log.info("请求参数 : {}", Arrays.toString(joinPoint.getArgs())); // 系统信息 log.info("浏览器:{}", userAgent.getBrowser().toString()); log.info("浏览器版本:{}", userAgent.getBrowserVersion()); log.info("操作系统: {}", userAgent.getOperatingSystem().toString()); } /** * 返回通知: * 1. 在目标方法正常结束之后执行 * 1. 在返回通知中补充请求日志信息,如返回时间,方法耗时,返回值,并且保存日志信息 * * @param ret * @throws Throwable */ @AfterReturning(returning = "ret", pointcut = "logPointcut()") public void doAfterReturning(Object ret) throws Throwable { endTime = System.currentTimeMillis(); log.info("请求结束时间:{}", LocalDateTime.now()); log.info("请求耗时:{}", (endTime - startTime)); // 处理完请求,返回内容 log.info("请求返回 : {}", ret); } /** * 异常通知: * 1. 在目标方法非正常结束,发生异常或者抛出异常时执行 * 1. 在异常通知中设置异常信息,并将其保存 * * @param throwable */ @AfterThrowing(value = "logPointcut()", throwing = "throwable") public void doAfterThrowing(Throwable throwable) { // 保存异常日志记录 log.error("发生异常时间:{}", LocalDateTime.now()); log.error("抛出异常:{}", throwable.getMessage()); } }@Before和@AfterReturning部分也可使用以下代码替代/** * 在执行方法前后调用Advice,这是最常用的方法,相当于@Before和@AfterReturning全部做的事儿 * * @param pjp * @return * @throws Throwable */ @Around("logPointcut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //获取请求头中的User-Agent UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); //打印请求的内容 startTime = System.currentTimeMillis(); log.info("请求Url : {}", request.getRequestURL().toString()); log.info("请求方式 : {}", request.getMethod()); log.info("请求ip : {}", request.getRemoteAddr()); log.info("请求方法 : ", pjp.getSignature().getDeclaringTypeName(), ".", pjp.getSignature().getName()); log.info("请求参数 : {}", Arrays.toString(pjp.getArgs())); // 系统信息 log.info("浏览器:{}", userAgent.getBrowser().toString()); log.info("浏览器版本:{}", userAgent.getBrowserVersion()); log.info("操作系统: {}", userAgent.getOperatingSystem().toString()); // pjp.proceed():当我们执行完切面代码之后,还有继续处理业务相关的代码。proceed()方法会继续执行业务代码,并且其返回值,就是业务处理完成之后的返回值。 Object ret = pjp.proceed(); log.info("请求结束时间:" + LocalDateTime.now()); log.info("请求耗时:{}", (System.currentTimeMillis() - startTime)); // 处理完请求,返回内容 log.info("请求返回 : ", ret); return ret; }测试结果2021-12-13 15:58:16.219 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求开始时间:2021-12-13T15:58:16.219 2021-12-13 15:58:16.220 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求Url : http://localhost:8080/test/getGetId 2021-12-13 15:58:16.220 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求方式 : GET 2021-12-13 15:58:16.220 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求ip : 0:0:0:0:0:0:0:1 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求方法 : 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求参数 : [zhangsan] 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 浏览器:CHROME9 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 浏览器版本:96.0.4664.55 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 操作系统: WINDOWS_10 2021-12-13 15:58:16.229 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求结束时间:2021-12-13T15:58:16.229 2021-12-13 15:58:16.229 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求耗时:14 2021-12-13 15:58:16.229 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求返回 : zhangsanDemoSpringBoot-AOP参考:springboot配置aop切面日志打印 - 森林木马 - 博客园 springboot + AOP 日志_请叫我猿叔叔的博客-CSDN博客_aop日志
2021年12月13日
866 阅读
1 评论
2021-11-15
工资发放日的区别
打工狗最关心的莫过于咱们啥时候发狗粮了,最近很多企业也纷纷打着疫情的幌子拖延给兄弟们发工资的时间,甚至还有一些物流企业出现扣押、递延部分工资(不是奖金哦,是工资)防止快递小哥哥们在忙季辞职的情况。作为被高成本挤压到消费降级的大城市小白领们,也是非常关注发工资的时间点,这关系到我们这个月能不能按时交租、按时还信用卡。今天知乎人称“干一行扒一行”的索小姐就来给大家扒一扒企业发工资时间点的门道儿~工资那点事儿看看大类型,你家公司属于哪类我们把企业发薪时点分几类:当月发薪、次月1-9号发薪、次月10-15号发薪、20号后发薪。劳动法规定薪酬递延发放不得超过一个月,所以正常企业都会在次月30号前完成发薪。影响发薪日期的因素主要有考勤统计时间、是否当月发绩效奖金、留人递延等。下面我们按类型分析:咋还会有提前发工资的??当月发薪事业单位和一些老国企偏多,这类企业通常对考勤出勤考核不严格,薪酬激励波动较小或年终一笔发放激励奖金。通常来说,企业的月基本工资计算公式为 基本工资/22*出勤天数,22是工作日天数,所以工资的计算是根据出勤天数来的,能够当月发放说明企业对考勤管理不是特别严格,默认员工出勤。且绩效工资不会在当月发放。因为每月统计员工绩效完成情况是要时间的。凡事都有特例,有一家国有券商就是当月发薪,次月根据考勤情况扣回缺勤多发,但这类比较少。这种良心单位呢,既然敢提前发,就说明他们不太在意你实际出勤率怎么样,就算你没有全勤,第二个月不会真的扣回来,因为人力算这个小账真的太费事了~~~我有个朋友入职一家国企7月14号入职的,他们公司的发薪日期是每个月15号发当月的,所以他一入职还没干活,就拿了全月的工资,次月没有根据缺勤扣回。次月1-7号发薪这类企业在大型国企、外企中占比很高,且通常为市场化程度较高的企业。递延到次月,是因为需要一定时间统计考勤情况。有人说,为什么不能用办公系统根据打卡情况直接算出出勤时间发工资呢?不能直接统计考勤的原因有这么几个:1)在10000人以上大型企业中,多数企业有区域分公司和事业部,管理权限和人事权限会下放到区域公司和事业部,所以无法通过OA直接统计全公司的考勤统计,需要事业部和分公司上报人员入离职、奖金和补贴增减等异动情况。我前家公司就是这类情况,总部人力在每个月2-4号开始向事业部收集人事异动,5号统计好,跑完薪酬报表,请人力资源部总经理和公司总裁签字审批后,6号交给代发银行,7号前发薪。2)员工不是每天都会准时打卡的,特别是销售类部门外勤较多,员工的外出申请提交不及时或者忘记打卡,多数企业不至于为这些事情扣减员工工资。所以他们会规定次月3号前,公司把考勤统计出来,员工根据统计表把漏签的提交申请补签上去,算全勤。这也会耽误统计时间。次月10-15号发薪也有许多港企、外企、大型国有银行、销售导向的企业采用这个时间段发薪,薪酬激励较为市场化,有些大型银行采用每月发部分绩效奖金的形式,所以对上月的业绩进行归集统计,算薪时间较长,10-15日有充足的时间。遇到节假日,一般会在15节假日前的工作日发薪。也有些企业采用两笔支付的,10号前发基本工资,30号前发本月绩效奖金的形式。20号以后发薪如果是经营状况良好的、股东不太差钱的企业,一般不会干这事。这类企业,有无利息侵占员工现金时间价值的嫌疑。主要动机是采用递延工资的形式增加员工的离职成本,降低人员流动性。这种发薪时段对信用卡、贷款的还款带来的现金流压力较大。在你拿offer的时候可以问一下工资时间,如果遇到这种,要警惕。努力做好每一次面求职准备,就是对自己最大的“不辜负”。素材来源于:“BOSS直聘”
2021年11月15日
2,355 阅读
15 评论
2021-11-14
利用GitHub520提供hosts文件定时更新本地hosts文件
之前自己利用 Gitea 搭建了一个Git私服,镜像 GitHub 项目的时候经常无法访问,导致镜像失败。后来发现了一个不错的项目 GitHub520 ,只要去修改本地 hosts 文件就可以访问GitHub了。但是每次去修改服务器的 hosts 文件,就有些繁琐了。后来写一个脚本,并配合 Linux 的 Crontab 定时更新,完美解决问题。脚本内容#!/bin/bash # 定时更新GitHub Host内容 # 利用项目GitHub520提供Host文件定时更新本地Host # # # Author: xiaose # Email: qingshanking@vip.qq.com # Github: https://github.com/qingshanking # Date: 2021/08/23 sed -i '3,$d' /etc/hosts # 上述作用是从第三行开始 进行修改,保留系统自带的hosts内容 curl https://raw.hellogithub.com/hosts >> /etc/hosts # 拉取hosts文件 写入本地hosts项目详情Crontab定时任务[root@localhost ~]# crontab -e ## -e: 编辑crontab定时任务 ## -l: 查询crontab任务 ## -r: 删除当前用户所有的crontab任务12345 ## 每30分钟执行一次ModifyHost 修改hosts文件 */30 * * * * /root/ModifyHost.sh更多用法,可参考Linux Crontab 定时任务
2021年11月14日
1,117 阅读
1 评论
2021-11-13
苹果M1安装JDK环境
自从前段时间给小可爱买了苹果 MacBookPro 后,我一直都没怎么体验过,刚好最近她暂时不用,我最近也挺闲,就用了几天,感觉“解放生产力的第一步就是生产工具”。正所谓“工欲善其事必先利其器”,所以总结一下使用过程和一些常用的工具使用。JDK安装由于Oracle公司没有适配苹果M1芯片的JDK,在网上找了一个zulu家的JDK,适合ARM架构的,也支持苹果M1芯片。拖动安装然后出现安装流程,下一步就可以安装完成。环境校验下载地址{cloud title="官网下载" type="default" url="https://www.azul.com/downloads/?version=java-8-lts&os=macos&architecture=arm-64-bit&package=jdk" password=""/}{cloud title="本站下载" type="default" url="https://pan.bcrjl.com/dev/jdk" password=""/}
2021年11月13日
755 阅读
0 评论
2021-11-09
CrystalDiskInfo硬盘信息检测工具
最近发现一款比较好用的查看硬盘信息(机械硬盘和固态硬盘都可以,比较好用)的软件给大家 —— CrystalDiskInfo 。看名字大家都应该能猜到它是和 CrystalDiskMark 同一家出的软件,完美继承了它家软件的特点:界面简单,功能简洁好用,有二次元皮肤。软件介绍硬盘里的数据至关重要,因此时常检查硬盘健康状况是有必要的,CrystalDiskInfo是一个十分小巧的软件,它通过读取S.M.A.R.T了解硬盘健康状况。打开它,您就可以迅速读到本机硬盘的详细信息,包括接口、转速、温度、使用时间等。软件还会根据S.M.A.R.T的评分做出评估,当硬盘快要损坏时还会发出警报,支持简体中文。软件截图软件下载{cloud title="官网下载" type="default" url="http://crystalmark.info/en/software/crystaldiskinfo/" password=""/}
2021年11月09日
772 阅读
1 评论
2021-11-01
Spring Boot 核心知识点总结
Spring Boot 核心功能独立运行Spring项目Spring boot 可以以jar包形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar来运行。内嵌servlet容器Spring Boot可以选择内嵌Tomcat、jetty或者Undertow,这样我们无须以war包形式部署项目。提供starter简化Maven配置spring提供了一系列的start pom来简化Maven的依赖加载,例如,当你使用了spring-boot-starter-web,会自动加入依赖包。自动装配SpringSpringBoot会根据在类路径中的jar包,类、为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。当然,SpringBoot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而SpringBoot灭有提供支持,则可以自定义自动配置。准生产的应用监控SpringBoot提供基于http ssh telnet对运行时的项目进行监控。无代码生产和xml配置SpringBoot不是借助与代码生成来实现的,而是通过条件注解来实现的,这是Spring4.x提供的新特性。Spring Boot 优缺点优点:快速构建项目。对主流开发框架的无配置集成。项目可独立运行,无须外部依赖Servlet容器。-提供运行时的应用监控。极大的提高了开发、部署效率。与云计算的天然集成。{dotted startColor="#ff6c6c" endColor="#1989fa"/}缺点:如果你不认同spring框架,也许这就是缺点。Spring Boot特性创建独立的Spring项目内置Tomcat和Jetty容器提供一个starter POMs来简化Maven配置提供了一系列大型项目中常见的非功能性特性,如安全、指标,健康检测、外部配置等完全没有代码生成和xml配置文件Spring Boot CLISpringBoot CLI 是SpringBoot提供的控制台命令工具。Spring Boot maven 构建项目spring-boot-starter-parent:是一个特殊Start,它用来提供相关的Maven依赖项,使用它之后,常用的包依赖可以省去version标签。Spring Boot几个常用的注解(1)@RestController和@Controller指定一个类,作为控制器的注解 ,并说明其区别(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉 (3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上 (6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。 (7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。spring boot是如何管理事务的?直接写@transactional注解就行,在方法就是方法事务,类上就是类事务。
2021年11月01日
456 阅读
1 评论
2021-10-31
Webfunny酷炫前端监控系统
前段时间发现一个不错的前端监控系统,支持用户细查、错误分析、接口分析、性能分析、流量分析、健康分析、上线安全监测等,对于前端追寻错误日志,还原错误场景有很大的帮助。跟随小编一起来了解并部署一套吧。用户细查用户细查旨在记录用户的每一步行为和操作记录,为开发者提供复现线上问题的可能。行为记录包括,浏览,点击,Js代码报错,接口请求的耗时、报错以及接口返回值等等,所有在前端产生的记录我们都会尽力记录下来,这样我们就可以轻松复现用户的问题,前端、后端、测试也都无需再扯皮了。错误分析错误分析主要是在两个维度,一个是JS代码错误,一个自定义错误。Js错误是通过window.onerror进行捕获的,而通过console.error打印出来的我们都认为是自定义错误。因为前端大部分的错误都是通过这两种方式捕获的,所以需要对这两种错误进行精细化分析。接口分析很多小伙伴都认为接口好像跟前端没有太大关系,接口日志的分析和查询应该交给后端,可现实中真的是这样吗。正常情况下,后端都是反感存接口返回值的,一个是日志存储量非常大,一个是后端调用的链路很长。而对于前端来说,只需要关心最后的结果,所以前端对接口的监控是非常合适的,我们可以快速定位到是不是接口的问题。性能分析性能分析也是很多前端朋友关注的重要功能,因为前端页面性能直接影响用户体验。如,页面加载耗时,Dom解析耗时,接口请求耗时,接口成功率等。健康分析如大家所知,监控系统会对前端项目的各种数据进行分析,但是大部分的监控系统都不会对项目的整体状况进行分析和评估。所以我们增加了一个健康分的统计功能,让大家对项目的健康状况有一个直观的了解。上线安全监测如大家所知,监控系统会监控线上应用的各项指标,如,错误,白屏,耗时等等,但是仔细一想,即使有这些监控,我们也不一定能够保证线上的应用是安全的,为什么呢?比如,当你上线了某个功能后,页面一切正常,但是某个流程无法进行了,这时候各项监控系统都不会有任何感知,即使你感知到,那也是一、两个小时之后的事情了,对于流量较大的应用来说,这个损失可不小。时间越长,开发者也要承担越大的责任。所以,webfunny的实时流量大屏幕,我们针对前端最关键的12大指标进行实时监控,让你在上线后的半小时内能够实时了解各项指标的变化趋势,来判断上线是否安全部署$ git clone https://github.com/a597873885/webfunny_monitor.git ## 国内地址 $ git clone https://gitee.com/webfunnyMonitor/webfunny_monitor.git ## 进入项目目录 $ cd webfunny_monitor ## 切换淘宝镜像源 $ npm config set registry http://registry.npm.taobao.org/ ## 如果没有pm2 可执行下面命令 $ npm install pm2 -g ## 初始化并安装 $ npm run init && npm install ## 修改数据库文件 $ cd bin/mysqlConfig.js ## 修改以下文件变更数据库 ------ module.exports = { write: { ip: 'xxx.xxx.xxx.xxx', // 远程ip地址 port: '3306', // 端口号 dataBaseName: 'webfunny_db', // 数据库名 userName: 'root', // 用户名 password: '123456' // 密码 } } ------ ## 运行项目 $ npm run prd ## 访问:http://localhost:8010/webfunny/register.html?type=1 ## 部署完成有需要的小伙伴,可以试试,效果和功能还不错。{dotted startColor="#ff6c6c" endColor="#1989fa"/}项目地址官网演示地址GitHub开源地址Gitee开源地址
2021年10月31日
650 阅读
3 评论
2021-10-14
Java获取MultipartFile文件的MD5
Java 获取文件的 MD5 ,核心都是通过 Java 自带的 MessageDigest 类来实现。获取文件 MD5 值主要分为三个步骤,第一步获取文件的 byte 信息,第二步通过 MessageDigest 类进行 MD5 加密,第三步转换成16进制的 MD5 码值。方法一/** * 获取上传文件的md5 * @param file * @return * @throws IOException */ public String getMd5(MultipartFile file) { try { //获取文件的byte信息 byte[] uploadBytes = file.getBytes(); // 拿到一个MD5转换器 MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] digest = md5.digest(uploadBytes); //转换为16进制 return new BigInteger(1, digest).toString(16); } catch (Exception e) { log.error(e.getMessage()); } return null; }方法二使用 Java 自带的 commons-codec 包,获取16进制 MD5 值的方法。DigestUtils.md5Hex():提供三种类型( byte[] 、InputStream 、String )生成MD5/** * 获取上传文件的md5 * @param file * @return * @throws IOException */ public String getMd5(MultipartFile file) { try { byte[] uploadBytes = file.getBytes(); //file->byte[],生成md5 String md5Hex = DigestUtils.md5Hex(uploadBytes); //file->InputStream,生成md5 String md5Hex1 = DigestUtils.md5Hex(file.getInputStream()); //对字符串生成md5 String s = DigestUtils.md5Hex("字符串"); return md5Hex ; } catch (Exception e) { log.error(e.getMessage()); } return null; }
2021年10月14日
979 阅读
2 评论
1
...
10
11
12
...
20