数据防扒指北 企业的发展离不开数据的支撑,尤其是核心的底层数据,随着技术的升级,数据方面的生成、传输、获取、处理、清洗、归纳逐步加上了安全的外衣,同行业间企业的竞争也逐渐演变成数据的竞争。最近项目中发现,系统中存在被爬取数据的行为,而且已经初步可以认定是竞对的手法,所以针对这一行为,需要升级防爬措施,避免关键数据的流失。数据防扒是很常见的数据安全攻防的场景,这里先说一下结论,
IDEA上传jar包至maven的私有仓库 最近老是需要更改自定义开源的jar包,自定义开发完成之后还需要上传到我们公司的私有仓库,每次上传过程不是很顺利,于是今天趁着过节记录一下[手动狗头]。除了IDEA的一键上传之外,还可以使用maven命令上传,笔者嫌一个个上传太麻烦,且不方便后面的更新发布,所以就采用文中介绍的这种方式。上传私服的jar一般需要更改对应的group,或者根据公司的命名规则更改就好,对应的版本号也最好和官方的版本进行区分。注意:上传仓库的类型一定要是hosted类型,否则会报405错误。
BUG记录——The temporary upload location xx is not valid 背景在用户使用导入excel文件的时候,生产环境突然报Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1867764691194364960.8045/work/Tomcat/localhost/rpay] is not valid这个错误,很显然,是因为服务器的指定目录不存在导致的,需要立即紧急给客户
密码强度校验 密码强度校验改造背景 由于对项目中用户的密码级别有一定要求,所以需要对用户的密码强度基于一定的校验,方便在重置密码时可以引导用户使用强度偏大的密码,以此为背景展开改造工作。 由于是对页面的改造,且涉及到多个项目,需要尽可能的改动少量文件,以下为实施过程。Demo搭建<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>密码强度检测算法分析及实现-zxcv
YYYY日期格式化坑点解析 背景今天在生产环境发现一个问题,给第三方推送的接口的时间参数跨了一年,导致对方查不到数据,首先定位了一下报文的代码,使用的new Date()并且进行了格式化,按说不会出现相差一年的情况。分析该系统一直运行稳定,最近并没有进行更新,上周的日期还是正确的,但是本周就行了,遂将该处代码进行单元测试。 @Test(description = "测试日期格式换") public void testDate() { System.out.println(DateUtil.format(
DataGrip使用教程(GIF版) DataGrip使用教程背景今天给大家介绍一款数据库连接工具,可能你正在使用navicat、workbench、sqlyog、DBeaver等等,这里不做拉踩,没有最好的工具,更没有完美的工具,即便众多连接工具的目标肯定是趋于完美,笔者认为,适合自己的才是最好的,下面给大家介绍一下jetbrain大家族中dataGrip,特色功能很多,下面只是列举了开发中常见的操作,欢迎大家评论补充。正文1、下载和安装https://www.jetbrains.com/datagrip/激活方式和IDEA一样
jetbrain产品历史版本下载 背景最近发现jetbrain的新版如果是需要使用的话,需要注册并且登录jetbrain的官方账号(笔者怀疑是,为了打击pojie的新手段),加入注册登录的话,那么官方必然可以获取到账号的单次试用时间,这样的话,可能就没法使用无限重置脚本进行特殊使用了,所以就想着下载历史版本方案假如,我们想下载webStorm的历史版本,对应的url为https://www.jetbrains.com/webstorm/download/other.html,当然如果想下载其他的产品的话,只需要将url中的websto
SVN迁移至GIT,并附带历史提交记录 SVN代码同步至GIT背景近年随着信息工程量的多元化发展,GIT主键取代SVN成为主流的版本管理工具,部门的项目代码也决定迁移至git进行管理,所以就调研了一下具体的实现方案,要求可以同步提交记录,便于历史追溯。准备工作个人SVN的用户名和密码(同步时需要输入)涉及到项目中SVN提交记录对应的SVN账号信息(可参考userinfo.txt文件,增量补充即可),左侧是SVN的账号,右侧是git账号信息,用=号连接,如下图:注意:需要将涉及到的同步记录中的用户都做映射,否则在同步时可能会报错
利用反射实现自定义比较器 问题背景需求:从第三方获取数据列表,传到前台进行展示,目前前台需要可以根据任意字段进行排序(升序和降序),但是第三方接口不支持排序功能,所以需要手动实现数据的排序。问题分析方案一:数据入库将第三方数据存储到数据库中,直接可以根据sql进行排序输出。缺点:本来就是实时数据,但是从数据库饶了一圈,先将数据写入,再将数据读出,增加了两次的数据库IO方案二:根据字段进行排序根据前台上送的字段信息和升降序信息,实现列表的排序功能。缺点:因为字段不确定,如果针对每个字段都实现一种排序方式,再加
Unboxing of ‘xxx‘ may produce ‘NullPointerException‘ 背景今早在排查生产日志的时候发现了一个空指针异常,遂跟踪了一下,最后发现报异常的代码如下if (null != vo.getLongitude()) { rsp.setDistance(Objects.isNull(map.get("distance")) ? null : (double) map.get("distance")); } //distance定义 private double distance;以上代码逻辑很简单,就是在经度不为空且计算的
RSA算法解密 javax.crypto.BadPaddingException: Decryption error 异常 背景最近需要对接京东的一个会员管家嵌入到小程序当中,在进行接口请求时,需要对敏感的字段进行RSA加密处理,所以想写一个工具类方便调用。生成秘钥、加密明文都没问题,就是在解密的时候时候出现了一下异常:原因在使用公钥加密的时候,最后我用了Base64进行了编码Base64.getEncoder().encodeToString(encryptedData)而在我进行解密的时候,直接使用了字符串的getByte获取了字节数组,导致得到的字节数组无法被秘钥解密。应该先使用Base64进行解码获取字节
maven中的dependencies和dependencyManagement的区别 背景介绍昨天CTO找到我,让我整理一下项目中的lombok包的版本,因为在项目打包运行的时候,总是会出现classNotFound的错误,怀疑是lombok包的版本不一致导致的。所以啊,我就开始在项目中引入lombok的地方一 一做修改,我们项目的子项目大概有15个左右,后来觉得有点笨拙,就在父pom中定义了一个lombok的版本变量,这样,我下次再进行版本修改的时候,只需更改父pom中的版本号即可。原本觉得做得很不错,于是把代码提交,CTO看了之后,让我了解一下DepencyManagement的用
sun.misc.BASE64Decoder的替换方案,使用java.util.Base64代替 背景在项目进行编译时,控制台会出现以下警告信息,提示sun.misc.BASE64Decoder是内部API,会在将来的版本的进行删除,需要避免使用解决使用java.util.Base64来替代,如下:使用原始的BASE64Encoderpublic static String imageToBase64ByLocal(File file) { byte[] data = null; // 读取图片字节数组 try (InputStream in
i++的线程安全性问题分析 背景今天分享一道常见的面试题:i++是线程安全的吗?既然这么问了,答案肯定是不安全啊,至于为啥不安全,咱们来说道说道分析前提谈到线程安全问题,那什么情况下会出现线程安全的问题呢,就是当多个线程操作同一个共享变量的时候,就会出现线程安全问题;那共享变量又是指哪些呢,就是存储在堆中即主内存的变量信息,包括全局变量、对象实例、静态变量等。而在方法内部的声明的临时变量是不会存在线程安全问题的,因为这些变量是存储在线程的工作内存中(即私有内存),线程与线程间是无法共享的。**所以,我们讨论的线程安全问
自定义拦截器实现权限校验 背景前几天接收到一个业务需求,简要描述一下,当某个企业账户冻结之后,企业在登陆后台管理系统,不能进行某些操作,如导入员工信息、发放员工福利、发票信息申请等,但是系统中的查看功能如账单查询、员工查询都可以正常使用。很显然,从全局去处理账户的状态判断是不可取的,因为在账户冻结之后,并不是所有的动作都是被禁止的,这里就可以使用过滤器对指定的方法进行筛选校验既定方案使用自定义的注解,标注需要进行账户状态校验的请求方法,使用拦截器拦截这些接口,在拦截器中执行账户状态的判断,如果账户状态正产则放行,如果状态异常
使用stopwatch实现接口的耗时日志输出 背景对接业务逻辑的耗时计算,以前都是使用System.currentTimeMillis();,分被获取开始时间和结束时间,最后算出差值来显示执行的耗时。spring框架中提供了一个秒表功能——stopwatch,我们可以直接实例化一个stopwatch的对象,调用start和stop方法即可完成时间的差值计算。stopWatch的基本使用用法public static void main(String[] args) throws InterruptedException {
解决Layui表格头部工具栏事件绑定失效,上传文件按钮失效问题 背景最近使用了layui的前端框架,也在慢慢适应中,好多功能都已经封装得很实用,遇到不会的功能,看看官网的demo的文档,都还是可以解决的,毕竟咱们的模仿能力还是可以的。记录一下昨天遇到的一个问题,就是我想在表格的头部工具栏,增加一个文件上传的接口,用于数据的批量导入,就简单的写了一个按钮,使用upload组件实现了功能,但是奇怪的事情发生了,第一次上传成功之后,页面不刷新,再次点击第二次的话,是无法上传文件,想后台发出请求的,最后排查的原因是,按钮上面的事件乜有被渲染,到时上传组件无法与指定的按钮进行
辨析BigDecimal的toString()方法和toPlainString()方法 辨析BigDecimal的toString()方法和toPlainString()方法toString()toString方法会将BigDecimal的值以科学计数方式的字符串但是转换成科学计数的方式也是有场景的,并不是所有的值都会转为科学计数方式的字符串,网上好几篇文章感觉都是照搬的一样,并没有详细的说明什么情况会以科学计数的方式输出字符串, 只能自己去扒了一下源码,首先,任何一个BigDecimal都可以使用一个公式表示:unscaledValue × 10-scale解释一下:unsca
BigDecimal去除尾部多余的0 方法new BigDecimal("100.20")).stripTrailingZeros().toPlainString()//100.2下一篇介绍一下toPlainString和toString的区别和用法
使用Arthas实现不停机更新 这里写自定义目录标题背景下载安装查询需要替换的文件的类加载器加载指定的class文件注意背景生产服务器的缺陷往往需要进行紧急更新,即使是多节点部署也避免不了需要重新启动服务器,使新的逻辑代码更新,所以不停机更新文件显得至关重要,今天介绍一下使用阿里的arthas实现不停机更新文件。大致思路:我们都知道class文件的加载都是依附于类加载器的,所以我们要做的就是让原本的类加载器重新去加载类文件,这样就可以实现不重启服务器更新应用。而arthas做的就是面向jvm,拿到指定的累加器和待更新的class编译