
Java
sp42a
What the web can be
展开
-
数据验证框架 Apache BVal 再使用
数据验证框架 Apache BVal 简介原创 2022-07-04 09:50:35 · 139 阅读 · 0 评论 -
Dubbo 3 于 Spring MVC 下使用注解配置
Dubbo 是做 RPC 的,基于 Socket + 高性能协议,肯定比 HTTP 调用快多。我当期架构逐渐向分布式靠近,——其实也不是最赶什么微服务的潮流,只是觉得写好的代码,如果不独立,都是依附在某个某个项目中(即“单体”)的话,则很不稳定,有点变化的不好维护。还是独立部署运行比较稳定可用。另外一点好处是,微服务其实可以减少代码重复!你想想看,各个模块哦都独立运行了,变成一个个项目,就是把这模块高度抽象提炼,最大限度复用当期的服务或者组件............原创 2022-07-03 20:04:38 · 136 阅读 · 0 评论 -
时序数据库 InfluxDB 2.2 初探
时序数据库是什么?这里就不科普了,敬请百度一下。时序数据是写多读少的场景。InfluxDB 用 Go 语言写,开源,应该还不错。但缺点是:单机版是免费开源的,集群版本是要收费的。安装分别下载数据库 Server 和命令行工具 CLI,两个独立的程序。安装后之后,执行 influx 启动 Server,注意暴露 8086 默认端口。influx这是临时启动的,我们改为守护进程执行的,nohup ./influx &然后对 Server 进行相应的配置,有 WebUI 的界面,访问其原创 2022-07-01 21:32:03 · 252 阅读 · 0 评论 -
JVM 中的服务器软件的稳定性
为了达到上面的要求,我们就需要对 Java 的 JVM 有一个比较深入的了解。在服务器软件稳定性方面,主要相关的东西是内存、线程、垃圾收集器,为了能够说明软件的稳定性,还需要掌握操作系统的各种查看工具和 Java 提供的各种工具转载 2022-05-24 21:18:09 · 112 阅读 · 0 评论 -
集中讨论关于缓存 Cache 的问题
转载几篇文章转载 2022-05-21 22:18:46 · 155 阅读 · 0 评论 -
Tomcat JDBC Pool 源码实现简单分析
通过阅读 tomcat-jdbc 的源码以学习一个数据库,或者可以扩展到更广意义上的连接池的实现。选择 tomcat-jdbc 的原因是足够的轻量,源码足够的简洁,同时又不失核心的功能转载 2022-05-21 18:59:43 · 155 阅读 · 3 评论 -
Java NIO 教程
本书介绍了Java平台上的高级输入/输出,具体点说,就是使用Java 2标准版(J2SE)软件开发包(SDK)1.4及以后版本进行的输入/输出。J2SE 1.4版代号Merlin,包含可观的I/O新特性,对此我们将作详细论述。这些新的I/O特性主要包含在java.nio软件包及其子包中,并被命名为New I/O(NIO)。通过本书,您将学会如何使用这些令人兴奋的新特性来极大地提升Java应用程序的I/O效率转载 2022-05-20 17:07:06 · 141 阅读 · 0 评论 -
如何写一个 RPC 框架
在后续一段时间里, 我会写一系列文章来讲述如何实现一个RPC框架(我已经实现了一个示例框架, 代码在我的github上)转载 2022-05-19 23:25:23 · 118 阅读 · 1 评论 -
SSO 轻量级实现指南(原生 Java 实现):SSO Client 部分
作为统一的认证中心,SSO 中心无疑拥有最根本的用户状态记录,一切皆以 SSO 中心的为准。但每次访问资源的认证工作都要通讯 SSO 中心,性能成本会不会太高呢?对于 SSO 中心服务器的性能也是严重的考验。对此,笔者考虑了以下几个个解决方案。原创 2022-04-28 19:28:21 · 743 阅读 · 0 评论 -
Tomcat 的线程池原理与 JVM 内存回收形象生动的介绍
Tomcat 的线程池原理原理我们先来看一下 Tomcat 的线程池原理:tomcat 原理如上图。Tomcat 线程池在工作的时候,实际情况是:以上述线程池为例,一开始就创建最小空闲数的线程在池里,20个,当同一时间请求数量大于最小空闲数20,比如来了50个并发请求,那么线程池还需要创建30个线程来处理请求。这时候当请求都处理完了,持续来的请求低于50个的时候,那么当时间过了60秒,并发数还是没有达到50,那么从第50个线程开始,线程池将按照,空闲时间达到60s的,开始逐个回收,49个,48个,4转载 2022-04-25 22:13:38 · 207 阅读 · 0 评论 -
SSO 轻量级实现指南(原生 Java 实现):SSO Server 部分
OAuth 是当前单点登录(SSO)和用户授权的标准协议——现在就让我们一起动手撸一个 SSO 的实现吧!原创 2022-04-22 23:23:02 · 505 阅读 · 0 评论 -
基于 BitMap 思想的标签框架
自乐高搭建系统在活动落地页的搭建中推广之后,搭建系统的落地页和模块数量就迅速增长。但却并没有一个入口可以帮助研发迅速的统计线上页面和页面中各模块的使用情况,无法对一些可能存在性能风险的页面进行跟踪(部分模块的特性导致该模块无法静态化,可能存在性能风险)。因此需要一个 线上页面和模块的统计解决方案用于解决此类数据统计问题。转载 2022-04-20 15:38:15 · 182 阅读 · 0 评论 -
轻量级权限系统全真做法(一)
之前做的权限系统 too old 了,重构之,于是就有了本文的全真开发过程。原创 2022-04-16 13:52:26 · 432 阅读 · 0 评论 -
大白话描述并发编程重要概念
在各类编程语言中,各种应用的开发中,为了提高执行效率,都会有涉及到多线程。而在多线程编程中,有许多的概念,这些概念在书中都以偏教科书的形式描述,并不易于理解。本文将会以更生活化的方式来描述多线程中常见的概念。转载 2022-04-15 00:01:41 · 72 阅读 · 0 评论 -
连接 HTTPS 证书二三事
HTTPS 已经普及了,我们看看在访问 https 资源遇到的事情。这里以原生 Java 的知识为背景,所以访问者为 `HttpURLConnection` 或 `HttpsURLConnection`。原创 2022-04-07 13:07:24 · 3941 阅读 · 0 评论 -
通用 DAO 接口设计
数据访问对象 DAO(Data Access Object)本质是个名词,但我们更多语境中不是作名词用,需要的是一套通用的接口去使用,至于返回的对象是什么,可以是 Java Bean 或者 Map 键对值。假设我们背后有一套数据访问机制,是 MyBatis、原生 JDBC 无所谓,只要能提供数据就可以了,那么目前需要设计一套标准的 DAO 接口,会是这样的。我们的目的是尽量可能简单衔接底层的据访问机制,提供常见的 `findById`、`findList`、`create`、`update` 等的操原创 2022-04-04 10:58:07 · 2586 阅读 · 0 评论 -
AJ 组件库之 支持热加载的配置器 EasyConfig
无论 xml 还是 yml 配置都归属 Spring 管理的,每次修改配置要重启服务器才能生效,于是思考怎么做一个不重启服务器的实现。实际上我之前都有探索过。原创 2022-03-20 17:36:30 · 143 阅读 · 0 评论 -
Java Web 简单监控
原理就是获取信息,然后解析并转化为目标结构信息输出。原创 2022-03-17 11:29:46 · 1097 阅读 · 0 评论 -
Spring MVC 用起来还是很香的
之前我有篇博文不推荐使用 Spring Boot,如今我再深挖 Spring MVC,更发掘出 Spring MVC 不俗的潜力。原创 2022-02-12 14:46:50 · 693 阅读 · 0 评论 -
MySQL 数据库定时自动备份
每天定时备份 SQL 到磁盘,通过一个简单的 Java Timer + Task 完成。原创 2022-01-17 23:08:10 · 357 阅读 · 0 评论 -
为实体提供枚举类型的支持
枚举很强大——我们用起来!原创 2022-01-02 16:41:16 · 661 阅读 · 0 评论 -
关于 ip 操作的几个实用函数
第一种方法,适合可以连接互联网的电脑。/** * 本地 ip 地址缓存 */public static String IP;/** * 获取本机 ip,带缓存的 * * @return 本地 ip 地址 */public static String getLocalIp() { if (IP == null) IP = getLocalHostLANAddress().getHostAddress(); return IP;}/** * 获取本机局域网地址 *原创 2021-08-18 21:46:28 · 177 阅读 · 0 评论 -
开发者实用函数两则:统计代码行数与每行代码的执行时间
在需要调试的方法中隔几行插入 `Timer.set` (数字或字符)方法,程序结束前调用 `Timer.print()` 方法就行了。因为目的只是排查方法执行时间,调试完成后可以将 `set()` 方法注释掉,然后利用 Eclipse 的查错功能将所有 `Timer.set()` 方法找出来删除。原创 2021-08-13 22:22:58 · 137 阅读 · 0 评论 -
免 JAR 依赖、纯 API 调用阿里云短信接口
不用依赖庞大的 jar 就可以发短信原创 2021-07-21 17:48:35 · 205 阅读 · 0 评论 -
Spring 使用经验谈
首先说说大潮流的 Spring Boot。因为项目强制要求的缘故,我不得不将 Spring 升级到 Spring Boot,但我个人觉得,这不但没有必要(不是做微服务),而且有以下几个问题……原创 2021-07-12 23:15:23 · 166 阅读 · 3 评论 -
关于工具包(Utils)的重新思考
工具包/助手包(英文多见于 Utils、Helpers、Tools)是框架的基础构成部分。随着时间的推移,我们的软件代码写得越来越多,API 中两次或两次以上使用到代码,可视为通用的逻辑,可考虑将其抽出来,封装形成公共调用的方法。至于出现多少次才能归纳到工具库,开发者必须有一个清醒的认识:如果出现少但也重构到公共库 API,那么这些所谓重用的 API 会显得非常琐碎,举一个反模式的例子:但凡是出现两次都算,那么是不是都要抽取到工具包里面呢?可以预见,这种“包罗万有”导致不但维护费力且调用者也觉得烦琐,少封装原创 2021-06-13 23:32:51 · 151 阅读 · 0 评论 -
Tomcat 使用技巧
Tomcat 使用技巧原创 2014-12-13 11:51:21 · 3424 阅读 · 0 评论 -
Eclipse 使用技巧
Eclipse 使用技巧原创 2014-01-13 11:28:00 · 1919 阅读 · 0 评论 -
JUnit + Mockito 单元测试
单元测试(Unit Test)是以最小粒度来测试某个功能或代码块。一般由程序员来做,因为它需要知道内部程序设计和编码的细节。对于持续发展的产品,单元测试在后期的维护和重构,回归有重要等方面有重要作用。不要认为烦琐多余就不写测试代码。相反而言编写测试代码会使你的压力逐渐减轻,因为通过编写测试代码,可以对类的行为有了确切的认识,使得更快地编写出有效率地工作代码。原创 2015-02-26 16:43:44 · 1752 阅读 · 0 评论 -
Java Web 实现 HTTP Basic 认证
Basic 认证是一种较为简单的 HTTP 认证方式,客户端通过明文(Base64 编码格式)传输用户名和密码到服务端进行认证,通常需要配合 HTTPS 来保证信息传输的安全。原创 2013-12-09 17:57:54 · 14308 阅读 · 4 评论 -
如何打造一个文件上传组件
文件上传(File Upload)在 Web 项目中广泛应用,都少不了这样一个的组件。有见及此 Servlet 3.0 将文件上传纳入 JSR 标准,通过几个注解便能配置好上传的功能,无须依赖其他组件。不过本着专研学习之目的,还是自制一款简单的文件上传组件。原创 2019-01-29 18:06:51 · 590 阅读 · 0 评论 -
JDK JavaScript 引擎的使用
本来,JavaScript 顾名思义就是 Java 之脚本,大抵就是精简化后的 Java,但从语言特性来说,却是“雷锋与雷峰塔”之间没有半毛钱的关系。不管如何 JavaScript 关系密切,从 JDK6 开始它们就绑定在一起,并制定了 JSR-223 规范,对应的包是 javax.script。早期基于整合 Mozilla Rhino,是个纯 Java 的 JavaScript 实现。Rhino 性能一般,于是 Oracle JDK 到了 v1.8 更换为自家的 Nashorn 引擎,性能不可同日而语。原创 2013-06-11 19:10:34 · 2136 阅读 · 0 评论 -
JDBC 数据库连接池的单元测试
如何模拟 JNDI 对象以便单元测试呢?首先需要加入 tomcat-juli.jar,这个包位于 `tomcat/bin` 目录下,需要手动复制到 Classpath 中;然后生成初始化上下文对象 InitialContext,下面就封装了一个方法 JdbcConnection.initIc();最后绑定实际数据源对象DataSource。原创 2013-12-10 16:49:26 · 1736 阅读 · 0 评论 -
100 行代码写一个图片验证码组件
验证码(Captcha)的作用是防止别有用心的人通过编写“自动注册机”这类手段来大量发送非法的请求。这类请求通常涉及数据库写的操作,因此要在后台设立一道防线来识别是否自然人的访问还是机器的操作。典型的一种方法就是图片验证码,如下图所示是一个加入干扰码的数字验证图片原创 2021-03-02 18:04:26 · 10000 阅读 · 21 评论 -
网易云对象存储 HTTP 文件上传
网易数帆的对象存储服务不错,企业用户免费,可以绑定 https 域名等等。官方提供了 SDK 调用对象存储的各种服务,是挺好的挺方便的,不过就是 SDK 依赖臃肿,本人不是很待见,于是改用其 HTTP 接口来简单完成文件上传的服务,可以说是折腾了一把。本文采用 Java 语言完成。生成授权信息为鉴别授权,必须在 HTTP 请求头中包含 Authorization 字段,该字段就是授权信息,必须验证遵守其 API 生成授权信息,否则不能访问其服务(只能匿名地部分访问)。生成方法如下(参考了官方文档)。A原创 2020-09-10 09:54:00 · 587 阅读 · 0 评论 -
用 Java 8 lambda 优化 JDBC
首先创建一个函数接口 ResultSetProcessor :@FunctionalInterfacepublic interface ResultSetProcessor { public void process(ResultSet resultSet, long currentRow) throws SQLException;}下面做个简单查询案例,使用这个接口遍历public static void select(Connection connection, String sql转载 2020-07-27 10:33:48 · 220 阅读 · 0 评论 -
部署时决定-插件机制
什么是插件如果我们的项目依赖了一个接口,但是我们在开发时,真的没办法确定,部署的时候,到底采用哪个实现。比如 Nutz 的 Log。 它在运行时,会判读当前运行环境 log4j 是否可用(有 log4j 的org.apache.log4j.Logger类), 如果没有,那么它就把日志信息输出到控制台上。它的实现,就是依靠的方式。但是,同复杂强大的 OSGI 插件体系不同,这里的插件只是强调,在部署时决定采用什么实现。在运行时,它是没 办法更改的。因此 Nutz 虽然在编译时依赖了 Log4j,但是在运行时转载 2020-06-29 12:47:17 · 271 阅读 · 0 评论 -
调用百度统计 API
百度统计为用户提供了 API 接入的方式,使得用户可以自定义 UI 而无须进入百度统计网站。百度统计存在两种账号体系:百度商业账号和百度账号,前者就是统计早期的用户账号,本文基于百度商业账号,说明如何接入统计 API。原创 2020-06-27 01:04:40 · 3715 阅读 · 5 评论 -
简简单单做一个带过期时间的内存缓存
做手机验证码的时候,一般都有五分钟或十分钟的限时机制,所以就需要把“号码–验证码”的信息暂存起来,过期便无效——类似于 Redis 自带过期的机制就适合了。不过应用 Redis 此类缓存模块要专门搭建环境和配置——比较繁琐,于是想到用 JVM 的缓存来做。关键地,我参考了该资源:https://blog.csdn.net/wab719591157/article/details/78029861并在这个基础上重写一遍,主要是改造为我自己的编码风格(例如泛型的处理,函数式 Lambda 代替 Inte原创 2020-05-25 00:49:55 · 974 阅读 · 0 评论 -
Java 压缩/混淆 JavaScript 代码
基本上都是自己写的工具构建前端工程,压缩/混淆 JavaScript 代码的工具必不可少。我们是 Java 平台的,就是说用 Java 去压缩 JS,这样比较方便。虽然咱们可以外部调用 node 等专门的前端构建工具,但那样不省事,能在 Java 圈子里面搞定就行,我们不搞太复杂的。好~闲话不多说,先看看低配版的。低配版这个低配版就几个函数组成,没以前来其他第三方的包,故称为“低配版”。简单实用也可以,我也用了很久。/** * This file is part of the Echo Web Ap原创 2020-05-10 19:35:19 · 1256 阅读 · 0 评论