自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(131)
  • 收藏
  • 关注

原创 微信测试账号 (5)-素材管理

前面只讲了文本消息,如果要发图片或语音视频等消息,则需要先将相关文件如图片上传到微信,之后可以将其作为素材,在消息中引用它,实现图片消息。新增图片素材 @GetMapping("/addMaterial") public void addMaterial(){ String url = "https://api.weixin.qq.com/cgi-bin/material...

2019-01-26 19:08:39 1243

原创 centos(18)-putty/winscp实现ssh密钥登录

在第3篇,我讲过用putty/winscp输入用户名/密码,远程登录服务器,这种登录方式存在一些安全隐患。而本篇讲的密钥登录是一种安全性别更高的登录方式。关于密钥及其他本篇讲到的一些安全性知识概念,参考web安全 (1)。ssh密码登录linux远程连接是使用的ssh,和https有点类似,流程如下:1.服务器开启时默认会打开ssh服务,ssh服务会检测服务器私钥/公钥,如果不存在就自...

2019-01-20 13:24:54 1022

原创 微信测试账号 (4)-菜单管理

进入公众号后,最下面一排的位置可以设置菜单按钮。菜单结构这是微信官网给的一个菜单结构示例,json格式。 { "button":[ { "type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC" },

2019-01-13 18:36:58 903

原创 微信测试账号 (3)-微信接口权限 access_token

有许多功能,需要我们主动调用微信的接口,比如修改公众号菜单,主动给用户发消息等。此时微信会对我们的权限进行验证,这个权限就是access_token。appID和appsecret登录测试账号时有两个参数,appID是公众号的唯一标识,appsecret就是密钥。关于密钥是什么,参考web安全(1)。获取access_token用你的appID和appsecret替换以下代码x...

2019-01-06 14:54:59 3024

原创 微信测试账号 (2)-消息验证sha1签名

在第1篇中实现了收发微信消息,但是没有做验证,本篇将介绍微信如何使用sha签名,对消息进行认证。其中安全相关的概念,如sha1散列值、签名等,可参考web安全(1)。验证参数 @GetMapping("/handler") public String handler(@RequestParam Map<String,String> map) {回顾 第1篇的get验证...

2019-01-01 16:07:23 2210 2

原创 web安全 (1)-密钥、随机数、散列值、数字签名、证书、https

本篇对web安全中一些常见概念做个基本介绍,并最终整合为https的整个流程。本文介绍的加密方法纯属个人虚构,与现实无关。因为现实中的加密算法太过复杂,暂不讨论。这里只用最简单的方法举例,只把概念讲清楚,也不考虑破解的可能性。凯撒密码这是凯撒当年的军用密码,是最古老,也是最简单的一种密码。举个例子:明文:ok密文:rn加密方式很简单,将明文字母向右偏移三位,o就是r,k就是n。...

2018-12-22 16:09:36 2681 1

原创 spring cloud (2)- eureka常用配置、保护模式

本篇将介绍eureka注册中心的一些常用配置。注册与获取服务在第1篇中,eureka注册中心启动时报错。因为默认情况下eureka自身也是注册中心的一个服务,也会向注册中心注册以及获取服务,而此时是没有注册中心的,所以报错,并且每隔一段时间会重新偿试连接注册中心。当注册中心也就是它自己启动成功以后,它重连成功,之后不再报错。而通常注册中心并不需要注册和获取服务,可作以下配置eurek...

2018-12-15 15:04:38 392

原创 微信测试账号 (1)-hello world

本篇以测试号为例,介绍如何接收微信的消息,同时回复消息hello world。环境jdk1.8,spring boot2,外网域名,内网穿透。内网穿透在开发微信公众号的时候,不仅我们需要调用微信的接口,微信也需要调用我们的接口,给我们发送各种消息。所以我们的项目要部署到互联网上才能接收到微信的消息。然而,在开发调试过程中我们往往处于局域网环境,不可能每改一次代码就部署到外网上去看效...

2018-12-08 14:26:57 1429

原创 spring boot2 (36)-xml数据的请求和响应、XmlMapper转换

虽然现在已经是json的天下,但是仍然有一些厂商接口要求xml格式。本篇将介绍如何接收和响应及转换xml格式。pom.xml     <dependency>        <groupId>com.fasterxml.jackson.dataformat</groupId>        <artifactId>jackson-dat...

2018-12-01 10:14:56 4917 3

原创 spring boot2 (35)-actuator监控

关于actuator的具体内容参考第21篇,这里不再重复。当时是spring boot 1.x版本,现在spring boot2.x中其主要内容基本没变,只是相关端点配置请求路径有所不同。本篇仅介绍这些变化的配置。开放端点1.x需要配置敏感端点,2.x改成了以下配置,* 可开户所有端点。management.endpoints.web.exposure.include=*/act...

2018-08-05 19:08:57 536

原创 spring boot2 (34)-task任务调度

通常后台程序是在用户触发以后才执行的,而有些特定功能,我们希望在一个特定时间由系统自己触发执行,比如每月1日统计上月度的相关数据等。fixedRate间隔执行@EnableScheduling:配置spring boot开启任务调度。 @Scheduled:在任意会被扫描的类方法加上这个注解,该方法会根据配置的时间来调度执行。 (fixedRate = 5000):每隔5秒执行一次...

2018-07-22 17:25:26 748

原创 spring boot2 (33)-兼容 jar包和war包部署

spring boot默认部署方式是jar包,但有时候可能运维使用的是tomcat之类的容器,并要求提交war包。本篇将介绍jar包和war通用的配置方式。pom.xml修改打包方式为war包<packaging>war</packaging>spring boot中已经集成了spring-boot-starter-tomcat内置容器,这里覆盖配置主要是为了设置provi...

2018-07-14 16:30:40 1512

原创 centos(17)-nohup、&、>、/dev/null、2>&1 后台离线运行程序

假如在putty上用相关命令开启一个程序,比如用java命令启动一个spring boot项目,此时日志会占据屏幕,无法再执行其他命令,并且一但关闭当前putty终端或按ctrl+c,该进程都会被结束。本篇将介绍如此让该进程脱离当前终端且始终运行。 & 后台运行命令 参数 &:在原有的命令和参数后面加空格&,此时当有日志时仍然会输出到屏幕,但进程会在后台运行,我...

2018-07-07 16:57:09 4017

原创 spring cloud (1)- hello world 服务注册与服务发现

大概在上个星期,基于spring boot 2 的第一个spring cloud稳定版本finchley发布了,本专题将基于finchley介绍spring cloud。当然,首先必须具备spring boot基础。服务注册与服务发现spring cloud主要用于快速构建分布式系统,而服务注册与服务发现是其实现分布式的核心基础,先来了解一下它的运行机制注册中心启动:用于衔接各个服务与客户端。服务...

2018-07-01 17:20:40 815 3

原创 centos(16)-搜索文件which/whereis/find

本篇介绍如何使用which、whereis、find三个命令来搜索文件。搜索命令文件which java:搜索java命令,结果表示,每次执行java命令的时候,实际上执行的是/usr/bin/java这个文件,即它的安装目录。再搜索一下cd,可以发现一些系统命令也是放在/usr下的。搜索特定目录文件whereis java:在特定目录(/usr和/etc)中搜索名为java的文件。whereis...

2018-06-24 16:07:38 671

原创 spring boot2 (32)-WebSocket和stomp消息

WebSocket可实现浏览器和服务器之间的通信,如在线聊天,消息推送等,其基于tcp协议来传输数据。而stomp是一种更高级的协议,可以更加方便的实现WebSocket。broker和客户端客户端可以是任何语言,如js,php等,只须使用stomp协议来收发消息,broker可对消息进行处理或转发等。本篇将介绍以spring boot实现broker,以js实现客户端。pom.xml <...

2018-06-17 14:20:11 2382 2

原创 spring boot2 (31)-cors跨域请求

假如我们开发了一些接口部署到网上,而我们的客户也有一个网站,会通过ajax请求我们的接口,并将结果展示到他们的网站,这就是跨域。直接请求No Access-Control-Allow-Origin我现在192.168.112.1上启动一个客户项目,用jquery向接口服务器192.168.112.150:8080/test发起ajax请求 $.ajax({ url : 'http://192....

2018-06-10 15:28:01 1305

原创 centos(15)-静态IP

默认情况下,服务器IP是动态的,如果你突然连不上服务器,原因有可能是IP变了。本篇将介绍如何配置静态IP。查看ip和网卡我在第2篇说过,lo是localhost,ens33是网卡标识,当时的局域网ip是192.168.108.129,现在已经变成了192.168.108.133。修改配置文件修改/etc/sysconfig/network-scripts/ifcfg-ens33:因为我的网卡是en...

2018-06-03 13:04:20 285

原创 spring boot2 (30)-Jackson和ObjectMapper

在spring boot中,默认使用Jackson来实现java对象到json格式的序列化与反序列化。如第3篇讲的@RequestBody和@ResponseBody的转换,最终都是由Jackson来完成的。ObjectMapper基本用法Jackson的转换是通过ObjectMapper对象来实现的,spring boot内部自动配置了一个ObjectMapper对象,我们可以直接用。 @Aut...

2018-05-27 14:58:23 11908 1

原创 spring boot2 (29)-ApplicationRunner和CommandLineRunner初始化

上一篇讲了缓存,当访问缓存时,发现没有数据就查询数据库并写入缓存。也可以在项目启动时就直接查询并写入缓存,以免用户请求的时候再去查询,此时就可以使用ApplicationRunner或者CommandLineRunnerCommandLineRunner用法很简单,只要实现该接口,启动项目后会立即使用run方法,args是启动参数。@Componentpublic class InitialRu...

2018-05-19 10:22:36 1241

原创 spring boot2 (28)-cache缓存

数据库的数据是存储在硬盘上的,频繁访问性能较低。而缓存数据存储在内存中,访问性能比硬盘快了一个数量级。如果将一些需要频繁查询的热数据放到缓存中,可以大大减轻数据库的访问压力。pom.xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>sprin...

2018-05-06 11:19:05 7988 2

原创 centos(14)-从源码安装程序

之前用rpm和tar安装的jdk,安装的是已经编译好的二进制文件,即计算机可识别的1010。而有些软件比如nginx和redis,只提供从源码进行安装,就是将其源代码文件(如C、java)编译成二进制文件,再安装到电脑上。本篇以nginx为例介绍如何从源码安装。安装编译环境就像编译java文件需要jdk环境一样,编译不同的程序也需要不同的环境,否则编译时会报错。执行以下命令:yum -y inst...

2018-04-29 09:37:18 787

原创 spring boot2 (27)-yaml配置

除了properties文件,spring boot同时支持用yaml文件来进行参数配置,其配置结构更加清晰优雅。基本格式上一篇在application.properties中数据源配置如下spring.datasource.url=jdbc:mysql://localhost:3306/testspring.datasource.username=rootspring.datasource....

2018-04-21 14:25:40 1729

原创 spring boot2 (26)-hikari、多个数据源/mybatis/事务

我在12篇讲过,spring boo1.x版本中,默认使用tomcat数据源,第二候选是hikari,虽然其性能更好,但是当时才刚刚出来需要时间的考验。而在spring boot2.x版本中,hikari终于荣升为默认数据源,已被包含在spring boot的jdbc依赖组件中。参数配置在properties中配置以下参数,前三个是通用配置,注意第四个参数maximumPoolSize有一个hik...

2018-04-14 11:33:29 15524 6

原创 spring boot2 (25)-RestTemplate客户端

关于rest可参考第3篇,而RestTemplate就是由spring提供的,用于在后台进行rest请求的,比繁琐的HttpClient要方便很多。pom.xml从本篇开始,后续文章都使用spring boot2,要求jdk版本至少8。之前的文章仍然适用于低版本的jdk,继续保留。spring boot 1和2大部分用法是一样的,只是有些功能做了细节调整。如默认连接池从tomcat变成了Hikar...

2018-04-06 11:38:16 5248

原创 Java数据结构(6)-ArrayDeque

前两篇讲过,ArrayList使用数组性能很高,LinkedList更擅长处理头部数据。而ArrayDeque即使用数组,又擅长处理头部数据。相关特点前面章节已经详细介绍过,所以,要理解ArrayDeque,请先理解前几篇文章的内容。双端队列上一篇讲过,LinkedList用链表实现了Deque,即双端队列。ArrayDeque则用数组实现了Deque,Deque用法参考第5篇结尾。现在eclip...

2018-03-24 09:33:27 397

原创 Java数据结构(5)-LinkedList

上一篇讲过,ArrayList在指定位置增加和删除性能较低。而有一种公认的观点:在经常添加和删除的场景下,LinkedList性能比ArrayList更高,这种说法是否可靠?本篇就来探讨一下。Node结构LinkedList集合中的每一个元素都是一个结点,将多个结点链接到一起,就是链表结构。以下是结点Node的源码,它是LinkedList的内部类。这段内容很简单,结点有三个引用变量和一个基本的构...

2018-03-18 14:56:52 484

原创 Java数据结构(4)-ArrayList

ArrayList是一个类,这个类有一个数组参数elementData,ArrayList集合中的元素正是保存在这个数组中,它继承了数组查询的高性能,参考第3篇。ArrayList还封装了很多方法,便于对数组中的数据进行操作处理,其中就包括上一篇说的扩容,建议先理解第3篇数组。扩容原理在eclipse中调试以下代码,如下设置四个断点,打开调试视图。 public static void main(...

2018-03-11 12:52:22 506

原创 Java数据结构(3)-数组

在java中,数组是查询性能最高的数据类型,同时也是集合类型的底层实现。内存结构String[] array = new String[10];如上,这里new了一个数组对象,数组中有10个引用元素,每个引用 又可以指向一个String对象。这10个引用元素并没有存储在数组对象中,而是在另一块内存中连续存储。上一篇讲过,数组对象只有16个字节,存储不下那么多元素,只需要存储第1个元素的内存地址。那...

2018-03-04 15:12:58 500

原创 Java数据结构(1)-前言

预留

2018-02-25 22:46:00 363

原创 Java数据结构(2)-变量与对象

变量与对象是所有数据类型的底层,如果不能准确理解变量与对象,就无法准确理解各种数据类型。识别变量与对象看看以下代码中,哪些是变量,哪些是对象。 int a = 1; int b = a; int c = 1; String x = new String(); String y = x; String z = new String();基本类型变量:java中有8种基本类型,其...

2018-02-25 14:24:38 764

原创 centos(13)-firewall防火墙管理

在window中可以ping通虚拟机ip,但是通过ip:8080却无法访问虚拟机中已启动的tomcat首页,因为有防火墙。 firewalld看到结尾的d就可以猜到它是一个开机自启的服务,那么就可以用systemctl命令来控制它,如对此不了解可参考上一篇内容。systemctl start firewalld:立即启动防火墙。systemctl stop firewalld:立...

2018-02-10 13:43:08 647

原创 centos(12)-systemctl服务管理

window每次开机时会自动开启一些服务,还可以把自己的程序注册为服务,在centos中也是一样。daemon守护进程当一个服务开启的时候,会启动一个程序,这个程序是在后台执行的,不会影响当前界面。所以表面上开启了一个服务,实际上是执行了一个程序,这个程序在linux中就被称为守护进程daemon。在linux中用过mysql的人应该对mysqld不会陌生,结尾的那个d就是daemon,即

2018-02-03 13:17:08 763

原创 centos(11)-ps进程管理

使用rpm和yum安装完后,保留在磁盘上的那叫程序。当使用命令启动程序时,他运行在内存中就叫进程。查看进程ps:查看进程。这里看到的只有当前环境的进程,还有其他环境和后台进程并没有显示。结果第一行是标题:PID:是进程id,由系统分配,非常重要。有些命令必要通过这个id找到这个进程,才能进行下一步操作。TTY:进程的执行终端,下面会讲。TIME:该进程总共占用cpu

2018-01-27 12:12:10 1054

原创 spring boot(24)-test测试

如果直接用junit去测试一个方法,即使测试成功,这个方法在spring中运行时也可能会有不同的结果,因为spring是一个集成环境,会加载很多东西,从而影响最终结果。本篇将介绍spring boot的集成测试,需要首先理解maven测试pom.xml org.springframework.boot spring-boot-starter-test test

2018-01-20 11:58:42 1579

原创 maven(20)-surefire测试

我在19篇生命周期讲过,当执行package或install的时候会自动执行测试,而测试周期的内置插件就是surefire。pom.xmlsurefire可以执行junit测试用例,首先引入junit依赖 junit junit 4.12 test测试用例surefire默认会执行src/test/java目录中符合以下命名规则的测试类

2018-01-13 11:42:05 908

原创 centos(10)-tar.gz解包和符号链接

在window中可以用rar或zip解压缩来安装程序,centos也有各种压缩文件,本篇将介绍当前使用最普遍的tar.gz文件。tar.gzgz后缀:使用gzip命令压缩的文件,指一个文件的压缩文件,没有打包。tar后缀:使用tar命令生成的包文件,指多个文件的打包文件,但并没有压缩。tar.gz后缀:使用tar打包,同时使用gzip压缩的文件。下载jdk.tar.gz

2018-01-06 10:05:33 1083

原创 centos(9)-PATH环境变量

在window中,配置jdk环境变量就是将java的bin路径追加到PATH的结尾。在centos中也有PATH,当在任意目录执行命令的时候,会从PATH的各个路径中去寻找这个命令文件并执行,如果找不到则无法执行。注意,centos区分大小写。查看PATH变量echo $PATH:显示PATH变量的值。echo是显示的意思,$是获取变量值。显示结果中':'是分隔符,window中是';

2017-12-23 10:30:51 1438

原创 spring boot(23)-文件上传与下载

先说上传,在Servlet3中提供了Part来简化上传功能,而在spring boot内部默认整合了Part来完成上传。html只需注意form要设置一个参数enctype="multipart/form-data",才能上传文件,其他不多说了。<!DOCTYPE html><html><head><meta charset="UTF-8">...

2017-12-16 10:54:00 2401

原创 centos(8)-权限

linux可以有多个用户同时登录操作,并且彼此隔离,互不干涉。这是linux非常重要的安全机制,而实现这一点的关键就是权限。权限身份在linux中对文件进行操作时,首先要知道操作者的身份,然后判断其身份是否有操作权限,而身份主要分为三种:拥有者、组、其他。拥有者:文件拥有者,比如用你的账户登录你的目录后,你创建的文件或者你用安装包安装的文件等,你都具有拥有者权限。组:除了拥有者

2017-12-09 11:18:39 4017

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除