1、ServletContextListener是Web容器提供的用来监听Web应用的生命周期事件(比如出生,死亡)的。EnvironmentLoaderListener就是这样一种监听器。
2、EnvironmentLoaderListener是shiro的入口,它实现了ServletContextListener接口,继承了EnvironmentLoader类。如图:
3、EnvironmentLoaderListener自己表面上做了两件事情:监听容器的启动与关闭事件;
(1)容器启动时,可以从 ServletContextEvent 中直接获取 ServletContext 对象,从而获取web.xml里的一些配置,比如我最想知道的.ini文件加载的地址。从中获取 WebEnvironment 接口的实现类(默认是 IniWebEnvironment),初始化该实例,并将其加载到 ServletContext 中
(2)当容器关闭时,销毁 WebEnvironment 实例,并从 ServletContext 将其移除。
4、实际上,上面两件事都是EnvironmentLoader做的
5、EnvironmentLoaderListener的两个方法是实现了ServletContextListener接口的contextInitialized和contextDestroyed。
总结:EnvironmentLoaderListener在容器启动时创建 WebEnvironment 对象,并由该对象来读取 Shiro 配置文件,创建WebSecurityManager 与 FilterChainResolver 对象,它们都在后面将要出现的 ShiroFilter 中起到了重要作用。从 web.xml 中同样可以得知,ShiroFilter 是整个 Shiro 框架的门面,因为它拦截了所有的请求,后面是需要 Authentication(认证)还是需要 Authorization(授权)都由它说了算。