0%

添加依赖

1
2
3
4
5
6
7

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
阅读全文 »

查看证书有效期

Let’s Encrypt 默认情况下只提供三个月的有效期,在有效期剩余半个月的时候,Let’s Encrypt 会发送邮件给你,提醒你需要做证书的续期操作。或者我们也可以通过以下命令查看证书的剩余有效期限:

1
2
3
4
5
6
7
8
9
10
11
$ ./certbot-auto certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: example.com
Domains: *.example.com example.com
Expiry Date: 2019-06-19 09:37:01+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
阅读全文 »

简单校验

在后端开发的过程中,验证前端参数的合法性是一个必不可少的步骤。但是参数验证会产生大量的样板代码,导致代码可读性差。使用 validator-api 可以简洁优雅的验证参数。我们来看一段代码:

1
2
3
4
5
6
7
@GetMapping
public ResponseEntity index(@RequestParam("userOrderId") String userOrderId) {
// 对订单ID做非空校验
if (null == userOrderId || "".equals(userOrderId))
return ResponseEntity.badRequest().build();
return ResponseEntity.ok().build();
}
阅读全文 »

Let’s Encrypt 证书不仅是免费的,而且支持通配符证书,通配符证书指的是一个可以被多个子域名使用的公钥证书,多个子域名使用起来十分方便。申请和配置的流程都非常简单,虽然每次的有效期为 90 天,但可以通过脚本去更新证书,只要配置好了,几乎可以一劳永逸。而市场上其他的通配符证书都比较昂贵,个人开发者平时做个小东西玩玩,Let’s Encrypt 应该是最好的选择了。

阅读全文 »

什么是面向切面编程

AOP 是一种编程范式,并非是 Spring 的独创,它与语言无关,是一种编程思想。AOP 可以帮助我们将通用的逻辑从业务逻辑中分离出来。从项目角度来讲,有一些逻辑散布于程序的各个地方,但它们的逻辑又是千篇一律的相同。比如:我们需要打印每个请求的 URL、请求参数、IP地址,最简单的做法是在每一个 Controller 中去打印出这些信息。如果使用 AOP,我们能够更加轻松的处理这些问题。打印日志并不是使用 AOP 的唯一场景,我们还可以通过切面去统一处理 声明式事务、缓存、应用安全 等等。

阅读全文 »

Spring IOC 容器的依赖注入工作可以分为两个阶段。第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通过手动组装或者让容器基于某种规则自动扫描的形式,将这些 Bean 定义收集到 IOC 容器中。下面是以XML配置的形式来注册一些 Bean

阅读全文 »

因为Http协议是无状态的,服务端不知道用户上一次做了什么操作或者请求了什么接口。简单来说就是浏览器发送了两次请求,服务端是无法识别这两次请求是否来自同一个用户。这也是为什么会有 SessionCookie 的原因,它们的作用就是用来维持客户端与服务端的会话。更简单的说,就是让服务端知道每一个请求都是来自于哪个用户。

阅读全文 »

权限控制是非常常见的功能,在各种后台管理里权限控制更是重中之重。在 Spring Boot 中使用 Spring Security 构建权限系统是非常轻松和简单的。Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

阅读全文 »

但愿你没有在数据库里直接存储明文密码!为了防治密码被窃取,数据库中存储的始终应该是某种形式的哈希值,而非明文密码。但是,Rails 3.1 之后可以利用 has_secure_password 来实现。这个 Rails 内部的机制充分考虑了密码验证和加密。它需要 model 中有一个 password_digest 字段,用来存储加密后的密码。

阅读全文 »

ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。ThreadLocal 不能使用原子类型,只能使用 Object 类型。ThreadLocal 的使用比 synchronized 要简单得多。ThreadLocalSynchonized 都用于解决多线程并发访问。但是 ThreadLocalsynchronized 有本质的区别。synchronized 是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而 ThreadLocal 为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而 synchronized 却正好相反,它用于在多个线程间通信时能够获得数据共享。synchronized 用于线程间的数据共享,而 ThreadLocal 则用于线程间的数据隔离。当然 ThreadLocal 并不能替代 synchronized,它们处理不同的问题域。synchronized 用于实现同步机制,比 ThreadLocal 更加复杂。

阅读全文 »