除了认证和授权,Spring Security 还提供了哪些安全特性
在 Spring Security 中,提供了一个 HttpFirewall 接口,从它的名字可以看出是作为防火墙使用,其定义如下: public interface HttpFirewall { FirewalledRequest getFirewalledRequest(HttpServletRequest request) throws RequestRejectedException; H...
分享技术与思考
CSRF 是啥? CSRF 是指跨站请求伪造,是 Cross-site request forgery 的简称,有些地方也简写为 XSRF。简而言之,就是攻击者通过某种手段,让用户访问曾经认证过的网站并执行特定操作,因为用户之前已经认证过了,因此这个操作会被误认为是用户执行的操作。 举个例子,假如一个银行的转账接口地址是 https://bank.com/withdraw?account=xxx&...
在 Spring Security 中,提供了一个 HttpFirewall 接口,从它的名字可以看出是作为防火墙使用,其定义如下: public interface HttpFirewall { FirewalledRequest getFirewalledRequest(HttpServletRequest request) throws RequestRejectedException; H...
在使用 systemd 配置系统服务的时候,都是从一个 Unit 配置文件开始的,这篇文章从一个例子入手,来聊一聊怎样看一个服务的 Unit 配置文件。 我们从比较常用的 Nginx 的 Unit 配置文件入手,当在 Linux 系统中通过包管理器安装 Nginx 之后,会自动添加 Nginx 的系统服务配置,要查看 Nginx 的服务配置,可以使用如下的命令: systemctl cat ngi...
上一篇(在 Linux 系统中将 Spring Boot 应用作为系统服务运行)介绍了如何使用 systemd 将一个 Spring Boot 工程配置为一个系统服务并随系统启动。对于日常的开发而言,这种部署方式和配置已经很少在新的项目中用到了,但是需要的时候,还是得去查一下用法,下次再用到不知道就到什么时候了,不如这次多了解了解 systemd。 以下是上次用到的服务配置内容: [Unit] D...
今天处理一个遗留项目的问题,有一个 Spring Boot 项目部署在一台客户内网的物理服务器上,最近由于一些原因,服务器经常会重启,每次重启后需要手动启动 Spring Boot 的工程,因此我需要将其配置成开启自启动的服务。 完成这件事需要借助 systemd。 它提供了一套系统启动和管理的解决方案。根据惯例,在 Linux 中,d 一般表示守护进程(daemon),比如 httpd 等。 要...
「栈」是每一个程序员都很熟悉的数据结构,英文叫做 Stack,在 Java 中,栈的实现类是 java.util.Stack。如果你了解 Java 中的 Stack 类,就会知道,这里有一个历史遗留问题: 这 Java 的源码,在注释中,Java 官方并不推荐使用这个 Stack 类,而是更推荐下面的写法: Deque<Integer> stack = new ArrayDeque&l...
随着 RESTful API 被越来越多地人接受,它已经被非常广泛地使用,并且,在日常开发中,大部分开发者写的 API 也越来越符合 RESTful 的规范。RESTful 系统设计中有一个重要的特性,就是 用超媒体驱动应用状态(Hypermedia as the engine of application state),也就是 HATEOAS。 先来通俗地介绍一下 HATEOAS。 通常我们开发...
ongoDB 的聚合框架是一个非常实用的工具,可以作用在一个或多个集合上,对集合中的数据进行一系列运算,类似于 SQL 的 where、join、group by、limit 等操作,或者 Java 中的 Lambda 操作。 整个剧和运算的过程,可以包含单个操作步骤,也可以包含多个。这一个或多个步骤,组成一个管道,对数据集合进行操作,如下: pipeline = [$stage1, $stage...
根据 Spring 的文档,Spring 中的 Bean 的 Scope 共有 5 种:singleton、prototype、request、session、application、websocket。其中,singleton 是默认值,也是最常用的,除此之外最常用的就是 prototype,其余都很少会用到。 当一个 Singleton 的 Bean,使用 @Autowired 注入一个属性的...
Java 是一门编译型语言,在完成代码的编写以后,需要使用 Java 编译器将源码编译成 .class 字节码文件,供 Java 虚拟机运行。Java 的源码和字节码都是以类为单位的,在字节码被 Java 虚拟机执行之前,需要将对应的类进行加载。 JVM 加载类的过程主要分为三个步骤:加载、链接和初始化。 加载 加载的过程,就是查找 .class 文件的字节流并创建类的过程。字节流的来源是多样的,...
相关文章:Spring MVC 是如何对对象参数进行校验的 在上述的这篇文章里,介绍了我们常用的 Spring MVC 的对象参数校验,是怎么完成校验的过程的,这篇来介绍一个更深入的问题。因为上篇中介绍的过程,适用于对象中的属性都是常用的 Java 数据类型,比如基本数据类型或者字符串等,如果这个对象中包含一个其它类型的参数,会怎么样呢? 比如这样的类型: @Data public class U...