0%

在完整的搭建了hexo博客之后,基本功能都可以使用,这时可以添加一些自定义的插件,丰富自己的博客

主题 - next

  1. 下载主题

    目前用的hexo版本是 5.3.0,目前next主题 5.0+7.0+8.0+ 版本的地址分别为不同的地址,这里选用 7.8.0 release 稳定版本

    注:不同的hexo版本和next版本可能存在兼容性稳定,目前用的 hexo 5.3.0next 7.8.0 版本可以正常运行

    1
    https://github.com/theme-next/hexo-theme-next/releases
  2. 配置主题

    • 将上面下载的zip包解压至 hexo 博客目录下的 themes/

    • 将文件夹重命名 next-7.8.0

      1
      2
      ├── themes        # 主题
      | └── next-7.8.0 # next主题
    • 博客的配置文件 _config.yml 修改主题为 next-7.8.0

      1
      2
      3
      4
      # Extensions
      ## Plugins: https://hexo.io/plugins/
      ## Themes: https://hexo.io/themes/
      theme: next-7.8.0

评论插件 - Valine

  1. 获取APP ID 和 APP KEY

    需要先登录注册 LeanCloud, 进入控制台后点击左下角创建应用,这个时候会生成 app idapp key

  2. 主题添加评论插件

    因为next主题直接集成了Valine插件,所以只需要配置自己的 app idapp key 即可

    注:这里更改配置的地方为 next 主题内的 _config.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # Valine
    # For more information: https://valine.js.org, https://github.com/xCss/Valine
    valine:
    enable: true
    appid: # Your leancloud application appid
    appkey: # Your leancloud application appkey
    notify: false # Mail notifier
    verify: false # Verification code
    placeholder: Just go go # Comment box placeholder
    avatar: mm # Gravatar style
    guest_info: nick,mail,link # Custom comment header
    pageSize: 10 # Pagination size
    language: # Language, available values: en, zh-cn
    visitor: false # Article reading statistic
    comment_count: true # If false, comment count will only be displayed in post page, not in home page
    recordIP: false # Whether to record the commenter IP
    serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
    #post_meta_order: 0

统计插件 - leancloud_visitors

  1. 获取APP ID 和 APP KEY

    需要先登录注册 LeanCloud, 进入控制台后点击左下角创建应用,这个时候会生成 app idapp key

  2. 配置

    同样因为next主题集成了相关的插件,这里只需要将app idapp key 添加到配置文件即可

    注:这里更改配置的地方为 next 主题内的 _config.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Show number of visitors of each article.
    # You can visit https://leancloud.cn to get AppID and AppKey.
    # AppID and AppKey are recommended to be the same as valine's for counter compatibility.
    # Do not enable both `valine.visitor` and `leancloud_visitors`.
    leancloud_visitors:
    enable: true
    appid: # Your leancloud application appid
    appkey: # Your leancloud application appkey
    # Required for apps from CN region
    server_url: # <your server url>
    # Dependencies: https://github.com/theme-next/hexo-leancloud-counter-security
    # If you don't care about security in leancloud counter and just want to use it directly
    # (without hexo-leancloud-counter-security plugin), set `security` to `false`.
    security: true

遇到的问题

  1. 现象:配置了next主题,无法显示 categories tags 等选择栏

    解决:手动创建页面,并配置好index.md

    1
    hexo new page "tags"

    配置 tagsindex.md

    1
    2
    3
    4
    5
    6
    ---
    title: tags
    date: 2020-12-19 22:38:35
    type: tags
    layout: tags
    ---
    1
    hexo new page "categories"

    配置 categoriesindex.md

    1
    2
    3
    4
    5
    6
    ---
    title: categories
    date: 2020-12-19 22:32:35
    type: categories
    layout: categories
    ---
  2. 现象:文章侧边栏目录点击无效(包含中文的目录)

    报错:

    1
    2
    utils.js:240 Uncaught TypeError: Cannot read property 'getBoundingClientRect' of null
    at HTMLAnchorElement.<anonymous> (utils.js:240)

    解决:目前有提到这个issue,有提到 7.9.0 版本解决

    1
    https://github.com/theme-next/hexo-theme-next/issues/1537

    看到当时的报错是utils.js,可以直接从github上拉取最新的utils.js 即可解决

    1
    https://github.com/theme-next/hexo-theme-next/blob/master/source/js/utils.js

Linux 是一种自由和开放源代码类UNIX操作系统。该操作系统的内核林纳斯·托瓦兹在1991年10月5日首次发布,在加上用户空间应用程序之后,成为Linux操作系统。

为了便于在 windows 上进行 Linux 学习,参照前辈的教程,在 windows 上基于 VMwareVirtualBox安装Linux系统。

Linux 环境

为了方便移植,这里选用了 VMware 作为 Linux 学习的工具。

Linux 下载

Linux 安装

  • 安装环境

    1. VMware 版本: 15.0.0 build-10134415
    2. Linux 版本:CentOS 6.8
  • VMware新建Linux注意事项

    1. 新建虚拟机时选自定义新建虚拟机

      2019012002

    2. 在安装客户机操作系统的选项中,选择稍后安装操作系统,然后点击下一步

      备注:此处如果直接选择安装程序光盘映像文件 iso 的选项,并导入 CentOS 系统,Vmware Workstation 将会执行简易安装,并且自动配置安装 CentOS 时的很多参数,不利于我们自定义系统。因此建议选择为稍后安装操作系统。

      2019012004

    3. 在选择客户机操作系统的选项中,先将客户操作系统的大类选项中选择为Linux,再将版本中的选项选择为Centos 64位,然后点击下一步

      2019012005

    4. 在命名虚拟机的选项中,首先为该次创建的虚拟机命名,也可保留为默认,然后在位置选项中可以为该次创建的虚拟机在计算机硬盘中指定对应的存储路径,然后点击下一步

      2019012006

    5. 在处理器配置的选项中,可以为该次创建的虚拟机分配处理器的数量与每个处理器的核心数量,建议按照物理计算机的实际CPU数量或实际CPU数量的一半的去分配,指定完成后,点击下一步

      2019012007

    6. 在此虚拟机的内存选项中,可以为该次创建的虚拟机分配可使用的内存大小,鉴于本次安装的是Linux,此处分配2G-4G即可,分配完成后,点击下一步

      2019012008

    7. 选择网络类型的选项中,选择默认的NAT模式即可

      2019012009

    8. 在选择磁盘的选项中,选择创建新虚拟磁盘即可,然后点击下一步

      2019012012

    9. 在指定磁盘容量大小的选项中,首先看到最大磁盘大小这一选项,一般来说,根据建议大小调整大小即可,不要去勾选立即分配所有磁盘空间,当然根据自己的需求与硬盘容量去适当的调整大小也是可以的,然后选择将虚拟磁盘存储为单个文件的选项,最后点击下一步

      2019012013

    10. 在已准备好创建虚拟机的选项中,根据自己的需要点击自定义硬件,添加、修改或者删除部分需要的硬件。然后点击完成

      2019012015

    11. 点击编辑虚拟机设置选择相应的iso文件

      备注:此处如果是载入Centos6.8的ISO,需要载入CentOS-6.8-x86_64-bin-DVD1.iso,对于Centos 6.8而言,会存在两个镜像,一个是CentOS-6.8-x86_64-bin-DVD1.iso,另一个是CentOS-6.8-x86_64-bin-DVD2.iso。DVD1中通常是系统和部分软件,DVD2中通常是附加软件包,如有需要,可以在安装完DVD1中的Centos6.8系统后再另行安装DVD2。

      2019012016

    12. 最后点击开启虚拟机

Linux 系统安装注意事项

  1. 虚拟机启动后,即会自动开始引导光驱中的 CetnOS6.8ISO 镜像,在 CentOS6.8 的引导界面上选择 Install system with basic video driver 即可开始安装进程

    备注:

    • Install or upgrade an existing system(安装或者升级一个已经存在的系统)
    • Install system with basic video driver(以基本的视频驱动程序来安装系统)
    • Rescue installed system(援救已安装的系统)
    • Boot from local drive(从本地驱动器引导)
    • Memory test(内存测试)

    2019012017

  2. 在运行一段自检程序之后,将会进入 CentOS6.8 的安装程序,首先看到的是 Media Test,选择 Skip跳过

    备注:

    • 其作用是为了在安装系统前检测安装介质是否存在问题,会花费较长时间。一般来说,不需要进行检测,选择跳过即可。

    2019012018

  3. 其后会询问在安装进程中需要使用哪种语言,选择简体中文,键盘选美国英文键盘

  4. 选择基础存储设备安装

    2019012020

  5. 接上一步选项下一步之后,此处是发现刚才选定的存储设备内可能包含数据,询问是否要忽略这些数据,选择是即可,点击下一步

    备注:

    • 此处因为是指定的空闲硬盘空间进行安装,因此可以确定没有数据,所以可以选择直接放弃所有数据,在实际操作中,还是要确认指定的存储设备是否有重要数据存在
    • 勾选的意思是在不检测所有存储设备内的分区与文件系统的前提下,应用本次忽略所有数据的选项到所有的存储设备,同理,因本次是空间硬盘空间安装,可以勾选本选项

    2019012021

  6. 为本台主机命名一个主机名,以便让本主机可以在网络上通过该主机名被唯一的辨识

  7. 选择时区

  8. 此处要求设置的是root密码,要求输入两次,两次必须一样,然后点击下一步

    备注:

    • 如果root密码设置的太简单,会提示你的密码太弱小,让你更改,如果要强行使用,点击Use Anyway即可

    2019012024

  9. 设置安装系统的方式

    备注:

    • 使用所有空间:
    • 替换现有 Linux 系统
    • 缩小现有系统
    • 使用剩余空间
    • 创建自定义布局

    2019012025

  10. 进入自定义布局页面

    备注:

    • 先创建 /boot 分区用来存放系统内核引导文件,一个空间大小为200M,文件系统类型为ext4的分区

      2019012027

    • swap分区(交换分区),充当虚拟内存使用,大小约为物理内存的2倍,如果内存够大,可以不配置swap文件系统

      2019012028

    • /分区分配剩余其他空间,因为其他目录都是在 /下生成

    2019012029

2019012030

  1. 在上图中分配完自定义布局后,点击下一步,会弹出格式化警告信息(Fromat Warning),告诉使用者该块磁盘上的数据将被摧毁,将按照使用者指定的布局来重新分区。点击格式化即可

  2. 此时会再弹出警告框,提示分区设置已选定,即将写入到磁盘中,所有原先在磁盘中的数据都将被删除,是否继续,点击将修改写入磁盘即可

    2019012032

  3. 此时会告诉你系统引导驱动器的位置被安装在何处,如果不想改变位置,可以保持默认,点击下一步继续

  4. 到可选软件包安装界面后,这里我们选 Desktop 类型安装

2019012034

  1. 然后等待进度条加载完成,点击Reboot,即可完成Centos6.8的安装

keystoretruststoreJSSE 中使用的两种文件。这两种文件都使用 javakeytool 来管理,他们的不同主要在于用途和相应用途决定的内容的不同。

keystoretruststore

这两种文件在一个SSL认证场景中,keystore 用于服务器认证客户端,而 truststore 用于客户端认证服务器。

比如在客户端(服务请求方)对服务器(服务提供方)发起一次 HTTPS 请求时,服务器需要向客户端提供认证以便客户端确认这个服务器是否可信。 这里,服务器向客户端提供的认证信息就是自身的证书和公钥,而这些信息,包括对应的私钥,服务器就是通过 keystore 来保存的。 当服务器提供的证书和公钥到了客户端,客户端就要生成一 个 truststore 文件保存这些来自服务器证书和公钥。

因为 keystore 文件既可以存储敏感信息,比如密码和私钥,也可以存储公开信息比如公钥,证书之类,所有实际上来讲,可以将 keystore 文件同样用做 truststore 文件。

httpclient 实现双向认证

由于公司给了密钥以及证书,所以直接可以用 keytool生成 keystore,由于服务器和客户端用的是一套证书,所以,生成的keystore既可以用来做keystore,也能做 truststore,从而实现双向认证的证书互相认证。上一篇介绍了如何生成 jks 文件,这里就不细说了,直接拿过来用。

maven import

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>

设置证书的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 设置证书
*
* @return
* @throws Exception
*/
private SSLConnectionSocketFactory getSslConnectionSocketFactory() throws Exception {
String client_key_pass = "changeit";

// keystore
KeyStore clientKeyStore = KeyStore.getInstance("JKS");
InputStream clientKeyStoreInput = new FileInputStream(new File("C:/test/keystore.jks"));
clientKeyStore.load(clientKeyStoreInput, client_key_pass.toCharArray());

SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(clientKeyStore, new TrustSelfSignedStrategy()) // 设置truststore
.loadKeyMaterial(clientKeyStore, client_key_pass.toCharArray()) // 设置keystore
.setSecureRandom(new SecureRandom())
.build();

// Allow TLSv1 protocol only
return new SSLConnectionSocketFactory(
sslContext,
new String[]{"TLSv1.2"},
null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
}

实例化httpclient

1
2
3
4
// 实例化httpClient
httpClient = HttpClients.custom()
.setSSLSocketFactory(getSslConnectionSocketFactory()) // 设置SSLSocket
.build();

通过以上的 httpclient 配置,即可实现 httpclient双向认证。

在访问有些 HTTPS 站点时,你还可能会遇到下面的异常:

javax.net.ssl.SSLHandshakeException:

sun.security.validator.ValidatorException: PKIX path building failed:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

In order to use the self-signed client certificate which was issued by a non public CA the public server certificate must be imported into a truststore.

在之前有介绍道关于 SSLHTTPS 的相关联性。我碰到的这个异常是因为只设置了 keystore 而没有设置 truststore

之前在网上查到的资料是通过设置系统环境变量,将其添加到 truststore

1
2
3
System.setProperty("javax.net.ssl.trustStore", "path/to/truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");

然后发现并不管用,于是直接在初始化 httpclient 的时候将 keystoretruststore 设置进去:

1
2
3
4
5
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(clientKeyStore, new TrustSelfSignedStrategy()) // 设置truststore
.loadKeyMaterial(clientKeyStore, client_key_pass.toCharArray()) // 设置keystore
.setSecureRandom(new SecureRandom())
.build();

SSL认证是指客户端到服务器端的认证。主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。

HTTPS 单向认证

1
2
3
4
5
6
7
8
9
10
11
Client -> Server: ①Client Hello(随机数,支持的加密算法)
Server --> Client: ②Server Hello(随机数,选择一个client支持的算法)
Server --> Client: ②Server证书
note left of Client: ③验证证书
Client -> Server: ④Client key Exchange(用Server公钥加密)
Client -> Server: ④Change cipher Spec(通知Server参数协商完成)
Client -> Server: ④Finish handshake(Encrypted handshake message)
Server --> Client: ⑤cipher spec + Finish handshake
note left of Client: 开始传输
Client -> Server: ⑥开始使用协商密钥与算法进行加密通信

流程:

Client Hello: 客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种讯息。

Server Hello: 服务器客户端传送 SSL 协议的版本号,客户端支持的加密算法,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

验证证书: 客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过, 通讯将断开;如果合法性验证通过,将继续进行第四步。

Client key Exchange: 合法性校验通过之后,客户端计算产生随机数字Pre-master,并用证书公钥加密,发送给服务器。

Change cipher Spec: 客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。

Encrypted handshake message: 客户端结合之前所有通信参数的hash值与其他相关信息生成一段数据,采用协商session secret 与算法进行加密,然后发送给服务器用于数据与握手验证。

cipher spec + Finish handshake: 验证通过之后,服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信。

⑥ 开始使用协商密钥与算法进行加密通信。

HTTPS 双向认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Client -> Server: ①Client Hello(随机数,支持的加密算法)
Server --> Client: ②Server Hello(随机数,选择一个client支持的算法)
Server --> Client: ②Server证书
note left of Client: ③验证证书
Client -> Server: ④Client key Exchange(用Server公钥加密)
Client -> Server: ④Change cipher Spec(通知Server参数协商完成)
Client -> Server: ④Finish handshake(Encrypted handshake message)
Client -> Server: ④Client证书
note right of Server: ⑤验证证书
Server --> Client: ⑥Change cipher Spec(通知Server参数协商完成)
Server --> Client: ⑥Finish handshake(Encrypted handshake message)

note left of Client: 开始传输
Client -> Server: ⑦开始使用协商密钥与算法进行加密通信

流程:

Client Hello: 客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种讯息。

Server Hello: 服务器客户端传送 SSL 协议的版本号,客户端支持的加密算法,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

验证证书: 客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过, 通讯将断开;如果合法性验证通过,将继续进行第四步。

Client key Exchange: 合法性校验通过之后,客户端计算产生随机数字Pre-master,并用证书公钥加密,发送给服务器。

Change cipher Spec: 客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。

Encrypted handshake message: 客户端结合之前所有通信参数的hash值与其他相关信息生成一段数据,采用协商session secret 与算法进行加密,然后发送给服务器用于数据与握手验证。

Client证书: 服务器要求客户发送客户自己的证书,客户端发送自己证书。

验证证书: 服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。

Change cipher Spec: 服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信。

⑦ 开始使用协商密钥与算法进行加密通信。

参考:

证书

数字证书(或简称证书)是在 Internet 上唯一地标识人员和资源的电子文件。证书使两个实体之间能够进行安全、保密的通信。证书有很多种类型,例如个人证书(由个人使用)和服务器证书(用于通过安全套接字层 SSL 技术在服务器和客户机之间建立安全会话)。

证书介绍

SSL 简介

wiki : 传输层安全性协议Transport Layer Security,简称 TLS),前身安全套接层Secure Sockets Layer,简称 SSL),是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。

Https : 超文本传输安全协议Hypertext Transfer Protocol Secure,简称 HTTPS,常称为HTTP over TLSHTTP over SSL),是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。简而言之,HTTPS 就是带加密的 HTTP 协议。

OpenSSL : 一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。其主要库是 C语言 所写成,实现了基本的加密功能,实现了 SSL/TLS 协议。也就是说 OpenSSLSSL/TLS 的一种实现。

证书标准

X.509 : 它是密码学里公钥证书的格式标准。X.509 证书里含有公钥身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。

证书文件扩展名

X.509 有多种常用的扩展名。不过其中的一些还用于其它用途,就是说具有这个扩展名的文件可能并不是证书,比如说可能只是保存了私钥。

  • .pem : Privacy Enhanced MaiDER 编码的证书再进行 BASE64 编码的数据存放在 ----BEGIN CERTIFICATE---- ----END CERTIFICATE----之中。

    查看 pem 格式证书信息:

    1
    openssl x509 -in own.pem -text -noout

    Apache*NIX服务器偏向于使用这种编码格式。

  • .cer.crt.der : Distinguished Encoding Rules, 通常是 DER 二进制格式。

    查看 der 格式证书信息:

    1
    openssl x509 -in own.der -inform der -text -noout

    JavaWindows 服务器偏向于使用这种编码格式。

  • .key : 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER

  • PFX/P12 : predecessor of PKCS#12 ,对 *nix 服务器来说,一般 CRTKEY 是分开放在不同文件夹中,但 WindowsIIS 则将它们存放在一个 PFX 文件中,通常会有一个提取密码

  • JKS : Java Key Storage ,利用Java的keytool工具可以将 PFX 转为 JKS,供 Java 调用。

上面只是对自己常用的证书后缀的一个简单解释,具体可参照 维基百科

证书转换

Java自带的 keytool 工具是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。

由于业务需要,需要 java 实现 https 双向认证,需要使用 keytoolopensslpem 证书转换成 jks 证书。

文件列表:

  1. own.pem: BASE64 编码的证书
  2. per.key: 密钥

生成JKS证书:

  1. 生成 pk12 密钥文件

    1
    openssl pkcs12 -export -in own.pem -inkey per.key -out test.pk12 -name test
  2. test.pk12 生成 test.jks

    1
    keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore test.jks -srckeystore test.pk12 -srcstoretype PKCS12 -srcstorepass changeit -alias test
  3. 除了生成 keystore 之外,还可以生成 truststore

参考:

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。它相比传统的 HttpURLConnection,增加了易用性和灵活性,它不仅让客户端发送 HTTP 请求变得更容易,而且也方便了开发人员测试接口(基于 HTTP 协议的),即提高了开发的效率,也方便提高代码的健壮性。

这里对HttpClient做简单的使用,目的是利用它来解决双向认证的问题。

使用 HttpClient 发送 HTTP 请求

GET请求&POST请求

HttpClient对每一种Http方法都准备了一个类,Get请求使用HttpGet类,Post请求使用HttpPost

模拟Http Get请求

1
2
3
4
5
6
// httpclient 4.3版本后使用HttpClients来实例化
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet request = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(request);

// read response

模拟Http Post请求

1
2
3
4
5
String parameter = "key=value";
HttpPost request = new HttpPost(url);
request.setEntity(
new StringEntity(parameter, ContentType.create("application/x-www-form-urlencoded"))
);

读取响应

HttpClient的输入是一个Entity,输出也是一个Entity。对于EntityHttpClient提供给我们一个工具类EntityUtils,使用它可以很方便的将其转换为字符串。

1
2
CloseableHttpResponse response = httpclient.execute(request);
String responseBody = EntityUtils.toString(response.getEntity());

上一节介绍了如何发布静态网页到github,但考虑到国内网速原因,想同时时间github和gitee多个托管网站,方便访问

同时发布到github和gitee

上一篇已经介绍如何发布到github,这里先介绍新建gitee项目

  1. gitee上创建名为xxx的项目(与github有所区别),xxx为自己的gitee用户名

  2. 设置项目的类型为JavaScript

  3. 配置deploy多个源,官方的格式是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 官方的格式
    # deploy:
    # type: git
    # message: [message]
    # repo:
    # github: <repository url>,[branch]
    # gitcafe: <repository url>,[branch]

    # 我的配置
    deploy:
    type: git
    repo:
    github: git@github.com:coofive/coofive.github.io.git,master
    gitee: git@gitee.com:coofive/coofive.git,master

    将hexo提交到github,实现多台电脑使用

  4. 在本地创建分支hexo

    1
    git checkout -b hexo
  5. 查看分支状态

    1
    git branch
  6. 本地commit后,提交本地分支到远程分支

    1
    2
    3
    4
    git add .
    git commit -m "hexo博客"
    git remote add origin git@github.com:liu253928127/liu253928127.github.io.git
    git push -u origin hexo
  7. 有可能发布后样式加载不出来,一般是css路径访问不对,所以在gitee创建项目的时候按照固定格式来最好

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

环境搭建

准备工作

  • 下载node.js并安装(官网下载安装),默认会安装npm。

  • 下载安装git(官网下载安装)。

安装hexo

  1. hexo官网(https://hexo.io)

  2. 设置npm镜像源为淘宝镜像,从国外镜像源下载很容易失败

    1
    npm config set registry http://registry.npm.taobao.org/
  3. hexo安装

    1
    npm install -g hexo-cli

    hexo的基本使用可查看官网文档或者官方示例hello-world

本地搭建hexo静态博客

  1. 新建一个文件夹,如blog

  2. 进入该文件夹内,右键运行cmd,输入

    1
    hexo init
  3. 初始化后,文件夹的目录如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .
    ├── .deploy # 需要部署的文件
    ├── node_modules # Hexo插件
    ├── public # 生成的静态网页文件
    ├── scaffolds # 模板
    ├── source # 博客正文和其他源文件等都应该放在这里
    | ├── _drafts # 草稿
    | └── _posts # 文章
    ├── themes # 主题
    ├── _config.yml # 全局配置文件
    └── package.json
  4. 加载node依赖

    1
    npm install
  5. 本地运行,即可访问http://localhost:4000 hexo首页

    1
    hexo s

    发布到github

  6. github上创建名为xxx.github.io的项目,xxx为自己的github用户名

  7. 打开本地的blog文件夹项目内的_config.yml的配置文件,将其中的type设置为git

    1
    2
    3
    4
    deploy:
    type: git
    repository: git@github.com:coofive/coofive.github.io.git
    branch: master
  8. 安装deploy插件

    1
    npm install hexo-deployer-git –save
  9. 本地生成静态文件

    1
    hexo g
  10. 将本地静态文件推送至github,或者生成和部署一行命令hexo g --d

    1
    hexo d
  11. 访问http://xxx.github.io就能看到刚刚本地部署的静态网页

最近想写一些博客,但又觉得自己搭建个人网站比较费时费力,偶然在看技术文档的时候,看到别人用hexo搭建博客,而且能直接部署在github上,省时省力,页面也很简洁。再加上自己忘东西忘得快,所以想整理自己的知识库,以便以后回顾!

博客

  每次遇到不懂的技术问题,或者为了解决某一个问题,会去google搜索大量的资料,大部分问题最终都能得到解决,在这个过程中我发现很多人的技术博客写的相当不错的,然后就收藏了大量的博客,等过一段时间再去看的时候,发现已经忘的差不多了,之所以忘得这么快,是因为这些东西并没有更好的整合消化掉。

  自己也有做笔记的习惯,一般来说写的东西只是针对某一个问题而写的解决方案,更多的是作为一个字典查询,并没有做进一步的总结。

知识体系

  网络日益发达的今天,每天接触的信息量很大,然而自己真正吸收并且转化为内需的并没有多少。

  每天接收很多微信公众号文章推送,看完后分享,点赞,收藏(收藏可能下次就不会再看了),觉得这个文章很好,可是说不出个所以然。

  感觉学的东西很多,但是又难以形成系统性的见解。或者让自己说出来,却说不出来。

  东西太多,信息量太大,怎么转化对自己更有用的东西。

  在网上看到大佬的见解就是,建立自己的知识体系!

我的知识体系

   关于知识体系目前处于空想阶段,以后贴出详细框架。