SecurityContextPersistenceFilter主要是在SecurityContextRepository中保存更新一个securityContext,并将securityContext给以后的过滤器使用
本质上就是在session中生成一个securityContext——httpSession.setAttribute(springSecurityContextKey, context);
它的逻辑是这样的
一、SecurityContextRepository.loadContext(),返回一个securityContext
loadContext里面的逻辑是这样的:
1、 判断session是否存在,如果存在先尝试从session中httpSession.getAttribute(springSecurityContextKey)获取securityContext,获取不到或则session不存在,返回null
2、判断securityContext是否为null,为null则新建一个securityContextImpl
3、将当前的securityContext的信息备份到SaveToSessionResponseWrapper,用户在后面的saveContext进行比较处理
4、返回一个securityContext
二、将securiryContext放入SecurityContextHolder中
三、执行下面的过滤器chain.doFilter(holder.getRequest(), holder.getResponse());
四、运行完SecurityContextPersistenceFilter之后的所有过滤器,清空SecurityContextHolder中的securityContext,并将securityContext(这个securityContext保存有后面过滤器生成的数据)放入SecurityContextRepository中,也就是执行SecurityContextRepository.saveContext();
saveContext的逻辑如下
1、 判断SecurityContext中的authentication是否为空或者是不是Anonymous角色,
如果是的话再判断session是否存在,如果session存在并且securityContext不为空的话,就从session将securityContext删除
这个的作用是如果你的权限过期了或者不具有权限,那么session就不不应该还存在securityContext
2、判断session是否为空,如果不为空,则比较securityContext是否有更新过(会与SaveToSessionResponseWrapper中的securityContext内容作比较),有的话,就更新下一下httpSession.setAttribute(springSecurityContextKey, context);
总结:由此可见SecurityContextPersistenceFilter主要是维护securityContext给后面的过滤器使用