0%

过滤web请求

在spring中存在一个DelegatingFilterProxy,是一种特殊的Filter,主要任务就是将工作委托给Filter实现类

使用@EnableWebSecurity注解时引入FilterChainProxy

1
2
3
4
5
6
7
8
9
10
11
12
@Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public Filter springSecurityFilterChain() throws Exception {
boolean hasConfigurers = webSecurityConfigurers != null
&& !webSecurityConfigurers.isEmpty();
if (!hasConfigurers) {
WebSecurityConfigurerAdapter adapter = objectObjectPostProcessor
.postProcess(new WebSecurityConfigurerAdapter() {
});
webSecurity.apply(adapter);
}
return webSecurity.build();
}

可以使用WebApplicationInitializer的方式来配置DelegatingFilterProxy,其会自动为每个url注册springSecurityFilterChain过滤器(也就是DelegatingFilterProxy),添加一个ContextLoaderListener来载入WebSecurityConfig

1
2
3
4
// AbstractSecurityWebApplicationInitializer类实现了WebApplicationInitializer接口,spring会发现,并在web容器中注册DelegatingFilterProxy
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}

DelegatingFilterProxy会拦截发往应用中的请求,并将请求委托给springSecurityFilterChain,springSecurityFilterChain本身是另一种特殊的Filter,可以连接任意一个或多个其他的Filter

1
2
3
4
5
6
7
8
9
10
11
private void insertSpringSecurityFilterChain(ServletContext servletContext) {
// DEFAULT_FILTER_NAME就是springSecurityFilterChain
String filterName = DEFAULT_FILTER_NAME;
DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy(
filterName);
String contextAttribute = getWebApplicationContextAttribute();
if (contextAttribute != null) {
springSecurityFilterChain.setContextAttribute(contextAttribute);
}
registerFilter(servletContext, true, filterName, springSecurityFilterChain);
}
阅读全文 »

springSecurity简介

Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案,是一种基于Spring AOP和Servlet规范中的Filter实现的安全框架,其本质是一个过滤器链

名词解释

主体(principal)使用系统的用户或设备或从其他系统远程登录的用户等等,谁在使用该系统

认证(authentication)权限管理系统确认一个主体的身份,允许主体进入系统,“主体”证明自己是谁

授权(authorization)将操作系统的“权力”授予“主体”,这样主体就具备了操作系统中特定功能的能力,授权就是给用户分配权限

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
阅读全文 »

监控工具

jvm自带的命令

jps命令

jps可以查看正在运行的java进程,并显示虚拟机执行主类的名称

1
2
3
4
5
6
jps [-q] [-mlvV] [<hostid>]

-q 仅显示java进程id,不显示主类的名称
-l 输出应用程序主类的全类名或jar包的完整路径
-m 输出虚拟机进程启动时传递给主类main()的参数
-v 列出虚拟机进程启动时的JVM参数

如果java程序启动 -XX:-UsePerfData,jps将无法探知到该java进程

阅读全文 »

keepalived

Keepalived是一款用于保障服务高可用性的软件,它能自动侦测服务器状态、移除故障服务器、切换到正常运行的服务器、添加恢复后的服务器到集群中。

实现的基本思路

Keepalived是基于VRRP协议的实现,主要用在IP层、TCP层和应用层。

  • IP层:Keepalived会定期向服务器群中的服务器发送一个ICMP数据包(Ping),如果发现IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除。
  • TCP层:类似IP层,只不过这里是检测TCP服务的端口
  • 应用层:Keepalived将根据用户的设定来检查服务程序的运行是否正常
阅读全文 »

Lua脚本

redis可以支持lua脚本,可以使用lua脚本来将几个命令整合为一个整体来执行,这样可以使得多个命令原子操作,且可以减少网络开销

Lua的数据类型

Lua是一个动态类型的语言,一个变量可以存储任何类型的值,类型有:

  • 空:nil,也就是还没有赋值
  • 字符串:用单引号 或者 双引号
  • 数字:包含整数和浮点型
  • 布尔:boolean
  • 表:表是Lua唯一的数据结构,既可以当数组,也可以做Map,或被视为对象
  • 函数:封装某个或某些功能
  • userData:用来将任意 C 数据保存在 Lua 变量中,这样的操作只能通过 C API
  • Thread:用来区别独立的执行线程,它被用来实现 coroutine (协同例程)
阅读全文 »