SpringBoot 集成 Spring Security(10)——角色继承
在本节中,补充下角色继承的知识点。角色继承其实是一个十分常见的需求,因为一般系统中角色权限呈金字塔型,高层用户拥有底层用户的权限。
例如存在以下角色:普通用户、VIP 用户、SVIP 用户、星悦会员,那么对应的权限可以是“星悦会员 > SVIP 用户 > VIP 用户 > 普通用户”。那么如何在 Spring Security 中实现这样的功能呢?
引言
为了简便起见,我直接使用《SpringBoot 集成 Spring Security(1)——入门程序》 的代码。
在该章中,我们存在两个角色,ROLE_ADMIN 和 ROLE_USER,并且经过我们的实验,/admin 接口只有 ROLE_ADMIN 有权限,/user 接口只有 ROLE_USER 有权限。
12345678910111213@RequestMapping("/admin")@ResponseBody@PreAuthorize("hasRole('ROLE_ADMIN')")public String printAdmin() ...
SpringBoot 普通 jar 与可执行 jar
前两天被人问到这样一个问题:
“为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误?”
大伙有这样的疑问,就是因为还没搞清楚可执行 jar 和普通 jar 到底有什么区别?今天就和大家来聊一聊这个问题。
多了一个插件
Spring Boot 中默认打包成的 jar 叫做 可执行 jar,这种 jar 不同于普通的 jar,普通的 jar 不可以通过 java -jar xxx.jar 命令执行,普通的 jar 主要是被其他应用依赖,Spring Boot 打成的 jar 可以执行,但是不可以被其他的应用所依赖,即使强制依赖,也无法获取里边的类。但是可执行 jar 并不是 Spring Boot 独有的,Java 工程本身就可以打包成可执行 jar 。
有的小伙伴可能就有疑问了,既然同样是执行 mvn package 命令进行项目打包,为什么 Spring Boot 项目就打成了可执行 jar ,而普通项目则打包成了不可执行 jar 呢?
这我们就不得不提 Spring Boot 项目中一个默认的插件配置 spring-boot-mav ...
Maven filter 实现 SpringBoot 多环境配置
一、前言
当我们正式开始工作生涯后,最先发现商业项目和我们自己写的项目的不同之一就是:怎么这么多配置文件啊!!
就按照最普遍的:开发、测试、预发(仿真)和线上来说,一个项目就至少有四套配置了,那么我们到底要如何配置多环境呢?
二、Multiple Application
目前使用比较多的是配置多个 application-{profile}.yml 文件的写法,一张图就能解释清楚了,如下图所示。
首先配置不同环境的 application 文件,在上图中我配置了以下环境:
application-test.yml
application-dev.yml
application-prod.yml
application.yml 文件用于配置各个环境通用的配置,在这里我指定了程序使用的 profile,即 spring.profile.active 属性,它的值决定了具体使用的配置。
例如 spring.profile.active=dev 时,使用 application-dev.yml + application.yml 的配置。
你可以看到,这里的值我设 ...
ES6 箭头函数
ES6 中添加了函数新的定义语法——箭头函数,当有大于一个形参的时候,必须使用()代表部分参数,函数体大于一行时,必须使用{}将函数体括起来,并使用 return 返回。
箭头函数不会创建自己的 this
箭头函数会在自己的作用域链上的上一层寻找 this。所以箭头函数会在定义时找到自己外层的 this,并继承这个 this 的值。在后面的任何操作中,this 的值都不会改变。
箭头函数的实现:
12345678var a = 1;function func() { setTimeout(() => { console.log(this.a); }, 1000);}func.call({a: 2});// 2
setTimeout 使用的是箭头函数,所以this在定义的时候就确定了,继为外层 func 的 this 的值。在函数执行的时候,通过 call 改变了 func 的 this 指向 {a:2}, 所以箭头函数继承 func 在执行环境中的指向 ...
SpringBoot 条件注解
一、引言
当我们使用 SpringBoot 进行开发时,会引入许多的 starter 包,引入后就会为我们做一些自动化配置,省去了大量配置的时间,快速开发。
以 Redis 为例,当我们引入 Redis 的 starter 包时:
1234 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
spring-boot-autoconfigure 包中有一个类叫做 RedisAutoConfiguration ,该类头上有三个注解:
@Configuration:标明该类是一个配置类,并注入容器
@ConditionalOnClass:当需求类均存在时,满足启用要求
@EnableConfigurationProperties:开启 @ConfigurationProperties 注解
当 spring-b ...
JS 防抖技术和节流技术
在监听窗口进行 resize、scroll 等调用函数频率很高的操作时,如果每次都做相应的处理,则会加重浏览器的负担,导致渲染延迟,甚至是假死,这样会给用户带来非常糟糕的体验。为此我们必须在特定场景下限制调用频率,但是又不影响效果。
一、防抖
防抖技术:使得事件被触发 N 秒之后再执行回调,如果再 N 秒内再次触发,则重新倒计时。
123456789101112131415161718192021var btn = document.getElementById('btn');var submit = function(value) { console.log(arguments[0]);}//监听按钮的点击事件btn.addEventListener('click', debounce(submit, 'hello'));function debounce(fn, value) { var timer = null; return function() { / ...
Java 并发编程——CountdownLatch
一、前言
今天来介绍下 concurrent 包下的一个工具类——CountDownLatch,这算是一个比较实用的工具类,在我们日常开发中使用的比较多,而且 API 也很简单,总结记录下。
二、基本使用
CountdownLatch 的主要功能是允许一个或多个线程等待直到在其他线程中一组操作执行完成,用人话说就是多个线程分别执行任务,另外某个线程等待这些线程全部执行完毕后,再做其他操作。
举个例子,麻麻在炒菜的时候,总是喜欢先将炒菜材料都准备好后,再准备开锅炒菜。由于今天家里来了客人,要准备的炒菜材料太多了,妈妈让你和你的弟弟一起来准备炒菜材料,麻麻等你们都准备好后开始炒菜。
在这个例子中,你和弟弟就分别是一个线程,你们做的工作就是准备炒菜材料。麻麻是另外一个线程,她会先休息会,等待你们都准备好后继续执行炒菜任务。
CountdownLatch 的主要 API 只有三个,如下所示:
12345public CountDownLatch(int count);public void countDown();public void await() throws Interrupted ...
Java 并发编程——ReentrantLock
一、简介
ReentrantLock 是一个可重入且独占式的锁,相较于传统的 Synchronized,它增加了轮询、超时、中断等高级功能。其类图如下:
ReentrantLock 是 java.util.concurrent(J.U.C)包中的锁,相比于 synchronized,它多了以下高级功能:
1. 等待可中断
当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。
2. 可实现公平锁
公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁。
synchronized 中的锁是非公平的,ReentrantLock 默认情况下也是非公平的,但可以通过带布尔值的构造函数要求使用公平锁。
3. 锁绑定多个条件
一个 ReentrantLock 对象可以同时绑定多个 Condition 对象。
ReentrantLock 有一个内部类 Sync,它继承了 AbstractQueuedSynchronizer(下文简称“AQS”),抽象了锁的获取和释放操作。Sync 有两个实现类,分别是 FairSync 和 NonfairSync, ...
详解 Cron 表达式
一、背景介绍
Cron 表达式,最初是应用于· Unix 系统中的 crontab 命令,用于设置周期性被执行的指令。Cron 表达式应用广泛,在服务器中,可以利用 linux 的 cron 服务定时执行一些脚本;在 Java Web 中,利用 cron 可以实现任务的定时执行。
本文将介绍 Cron 表达式的语法,理解 Cron 表达式的构成。
二、Cron 语法
Cron 表达式由6位或7位由空格分隔的时间字段构成,Cron 表达式忽略字符和特殊值的大小写,具体如下表所示。
位置
含义
允许数值
允许特殊值
1
秒
0 ~ 59
, - * /
2
分钟
0 ~ 59
, - * /
3
小时
0 ~ 23
, - * /
4
日期
1 ~ 31但也与具体月份有关,不是每个月都有31日
, - * ? / L W C
5
月份
1 ~ 12 或JAN - DEC
, - * /
6
星期
1 ~ 7 或 SUN,MON,TUE,WED,THU,FRI,SAT【注:周日是第一天】
, - * ? / L C #
7
年份(可选)
1970 ...
Apollo 配置中心介绍
一、前言
最近我司进行基础架构升级,将配置中心从 Spring Cloud Config 迁移至 Apollo。趁此机会也学习下 Apollo,本文主要知识来自于我对官方 Wiki 的学习,如有错误,欢迎勘误。
Apollo(阿波罗)来自于携程研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
Apollo 服务端 基于 Spring Boot 和 Spring Cloud 开发,因此对于 Spring Cloud 项目能够很好的结合。官方提供 Java 和 .NET 两种语言的不依赖任何框架的客户端,另外还提供了 API 接口,便于其他语言或整合到自有框架中使用。由此看来,Apollo 接入到项目中是较为容易的。
演示环境:106.12.25.204:8070
账号/密码:apollo/admin
二、主要特点
2.1 Feature
(1)统一管理不同环境、不同集群的配置
Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群( ...