开发小笔记(持续更新)
集合操作(排序、分组、分页) 点击查看
stream分组:groupingBy(Function)、groupingBy(Function,Collector)、groupingBy(Function,Supplier,Collector)一个参数:一个分组器,使用提供的字段对集合元素进行分组,返回一个Map<字段,相同字段值的元素集>Map<String, List<Employee>> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity));两个参数:一个是分组器,按提供的字段进行分组。一个收集器,下面举例了3种用途// 先按city分组,再对组里面的成员,统计总销售额Map<String, Integer> map = emps.stream() .collect(Collectors.groupingBy(Employee::getCity, Collecto ...
java项目安全问题
1.弱口令漏洞
解决方案:最好使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密,或者多种加密方式叠加组合。
2.未使用用户名及密码登录后台可直接输入后台URL登录系统。
解决方案:通过配置filter来过滤掉无效用户的连接请求。
3.JSP页面抛出的异常可能暴露程序信息。有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等。
解决方案:自定义一个Exception,将异常信息包装起来不要抛到页面上。
4.合法用户”注销”后,在未关闭浏览器的情况下,点击浏览器”后退”按钮,可从本地页面缓存中读取数据,绕过了服务端filter过滤。
解决方案:配置filter对存放敏感信息的页面限制页面缓存。如:
httpResponse.setHeader(“Cache-Control”,”no-cache”);httpResponse.setHeader(“Cache-Control”,”no-store”);h ...
linux常用命令
Linux 系统目录
├── bin -> usr/bin # 用于存放二进制命令├── boot # 内核及引导系统程序所在的目录├── dev # 所有设备文件的目录(如磁盘、光驱等)├── etc # 配置文件默认路径、服务启动命令存放目录├── home # 用户家目录,root用户为/root├── lib -> usr/lib # 32位库文件存放目录├── lib64 -> usr/lib64 # 64位库文件存放目录├── media # 媒体文件存放目录├── mnt # 临时挂载设备目录├── opt # 自定义软件安装存放目录├── proc # 进程及内核信息存放目录├── root # Root用户家目录├── run # 系统运行时产生临时文件,存放目录├── sbin -> usr/sbin # 系统管理命令存放目录├── srv # 服务启动之后需要访问的数据目录├── sys # 系统使用目录├── tmp # 临时文件目录├── usr # 系统命令和帮助文件目录└── var # 存放内容易变的文件的目录
一、目录操作 p ...
markdown常用语法
前言写过博客或者github上面的文档的,应该知道Markdown语法的重要性,不知道的朋友们也别着急,一篇博客轻松搞定Markdown语法。话说这个语法超级简单,一看就会,不信你点进来看看。
快捷键
功能
快捷键
加粗
Ctrl + B
斜体
Ctrl + I
引用
Ctrl + Q
插入链接
Ctrl + L
插入代码
Ctrl + K
插入图片
Ctrl + G
提升标题
Ctrl + H
有序列表
Ctrl + O
无序列表
Ctrl + U
横线
Ctrl + R
撤销
Ctrl + Z
重做
Ctrl + Y
基本语法
2.1 字体设置斜体、粗体、删除线*这里是文字*这里是文字**这里是文字*****这里是文字***~~这里是文字~~
2.2 分级标题写法1:
一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题 这个写法和 **文字**效果是一样的
写法2:
这是一个一级标题 或者
二级标题
2.3 链接(1)插入本地图片 ...
corn表达式动态配置
由于业务需求,需要提供一个能够让用户动态配置定时任务的入口,定时去同步数据
1、简单的业务处理,直接使用@Scheduled注解就能开启定时任务,例如在方法上@Scheduled(cron = “0 0/1 * * * ?”),书写cron表达式就能配置定时任务。
/** * 每分钟触发一次 */@Scheduled(cron = "0 0/1 * * * ?")public void execEveryDay() { checkPlan();}
2、但是随着业务复杂化,使用注解目前是满足不了动态配置定时任务的,以下代码能够实现cron表达式的动态配置。
第一步,在启动类新增注解@EnableScheduling
@SpringBootApplication@EnableSchedulingpublic class testApplication { public static void main(String[] args) { SpringApplication.run(testApplica ...
接口性能优化
前言 接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。
该问题说简单也简单,说复杂也复杂。
有时候,只需加个索引就能解决问题。
有时候,需要做代码重构。
有时候,需要增加缓存。
有时候,需要引入一些中间件,比如mq。
有时候,需要需要分库分表。
有时候,需要拆分服务。
等等。。。
导致接口性能问题的原因千奇百怪,不同的项目不同的接口,原因可能也不一样。
本文我总结了一些行之有效的,优化接口性能的办法,给有需要的朋友一个参考。
1.索引接口性能优化大家第一个想到的可能是:优化索引。
没错,优化索引的成本是最小的。
你通过查看线上日志或者监控报告,查到某个接口用到的某条sql语句耗时比较长。
这时你可能会有下面这些疑问:
该sql语句加索引了没?
加的索引生效了没?
mysql选错索引了没?
1.1 没加索引sql语句中where条件的关键字段,或者order by后面的排序字段,忘了加索引,这个问题在项目中很常见。
项目刚开始的时候,由于表中的数据量小,加不加索引sql查询性能差别不大。
后来,随着业务的发展,表中数据量越来越多, ...
获取客户端真实ip
现在都流行显示 ip 归属地,那么我先来获取客户端的真实 ip 地址以及 mac 地址,上代码
import javax.servlet.http.HttpServletRequest;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.UnknownHostException;/** * 常用获取客户端信息的工具 */public class NetworkUtil { /** * 获取ip地址 */ public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) ...
服务占用cpu过高排查
先用top命令找出CPU占比最高的
top
CPU占用最高的是java进程,它的 进程ID:3362
ps -ef 或者 jps 进一步定位,得知是怎样的程序
[root@192 ~] ps -ef | grep 3362 | grep -v greproot 3362 2340 42 21:47 pts/0 00:02:30 java HelloWorldApp
定位到具体的线程或者代码
ps -mp 3362 -o THREAD,tid,time
如图所示,引起CPU过高的 线程ID:3363
将线程ID转换为16进制格式(英文小写)
3365 转换为16进制结果:d23
jstack
格式:jstack 进程ID | grep tid(16进制小写) -A60
jstack 3362 | grep d23 -A60
这样,就能找出具体的异常代码位置
java常用第三方工具库
1. java自带工具方法 jdk本身自带很多工具库,比如util包下,rt扩展下的,collectios带s的集合工具类,string自身的substring,isEmpty等。
package com.zrj.tool.utils;import org.junit.Test;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Objects;import java.util.stream.Collectors;/** * java自带utils * jdk自带util工具类有很多 * Collections 集合工具类 * String的substring等 * * Date类型 * * @author zrj * @date 2021/7/1 * @since V1.0 **/public class JavaUtils { /** * List集合测试工具 * <p> * List集合转换成以指定字 ...
docker十五问
前言 本文总结了Docker常见的问题和坑,采用问答的形式,分享给大家
⛳️ 1.什么是Docker?
📖 Docker 是一个开源的应用容器引擎,基于go 语言开发并遵循了apache2.0 协议开源📖 Docker 是在Linux 容器里运行应用的开源工具,是一种轻量级的”虚拟机”📖 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器也可以这样形象的比喻:Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
⛳️ 2.Docker的应用场景有哪些?
Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
📢📢📢 在这里我重点介绍下Docker作为内部开发环境的场景
在容器技术出现之前,公司往往是通过为每个开发人员提供一台或者多台虚拟机来充当开发测试环境。开发测试 ...