文章目录
前言
1:几个核心问题
之前,我们引入了一下这四个问题,接下来,我们会在后续的文章中一一解答。
2:一个关键思考
如何实现client向server发送请求时,先检测用户是否登录,登陆了才能访问,没有登录重定向登录页面?
如果向实现这个东西,那么客户端请求的时候就不能直接碰到web应用,而是对当前的请求进行一个登录检查,如果是已经登录那么就继续访问web资源,如果没有登录那么就返回登录页面。
适用于这个点的功能组件,我们首先想到的就是过滤器或者叫拦截器!
SpringSecurity的技术手段是怎样的呢?SpringSecurity对于Servlet的支持是基于Servlet Filter的。也就是说SSC的实现技术手段也是Filter。
一:回顾Filter
1:过滤器概念作用
当客户端访问一个Servlet时,需要经过一系列的过滤器。这一系列的Filter和Sevlet形成了一个Filter Chain的概念。下面的图显示了单个Http请求的处理程序的典型分层
过滤器由
2:过滤器核心代码
这个方法是必须被覆盖重写的方法。在这个方法里边chain.doFilter放行当前过滤器,进行下一步过滤器。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// do something before the rest of the application
chain.doFilter(request, response); // invoke the rest of the application
// do something after the rest of the application
}
3:过滤器原理
必须实现 Filter 接口过器在访问 Web 资源可以对请求进行拦截,并对请求进行预处理和后处理操作,然后将请求传递给日标资源。
比如,强制登录过滤器,访问 web 资源时先对请求进行登录检查,已登录可以往后访问,未登录重定向回登录页。
4:过滤器链 FilterChain
在对一个 web 资源进行拦截处理时的多个 Filter 和 web 资源组成一个FlterChain 过照链
FilterChain 中的 doFilter() 方法非常重要,用于让 Filter 链上的当前过滤器放行,使请求或响应进入下一Filter 或 web 资源
二:SSC的FilterChain
1:原理
SpringSecurity在实现的时候也是基于了一系列的Filter。
其中有几个重要的:DelegatingFilterProxy(委托过滤器代理),这个是Servle容器和Spring工厂之间的桥梁。
如果在应用的过滤器链中想使用SpringSecurity的过滤器,那么就需要DelegatingFilterProxy就在FilterChain里边。然后就往原生的Filter Chain里边注入了Spring Security的FilterChain。
2:图示
具体的实现原理请查看下面的文章。