第六节 与WEB集成原理分析
前言
本小节仅仅是分析shiro的WEB环境加载的过程。有时候我们在使用框架或者集成其它插件的时候,可能会遇到各种各样启动的问题,这个时候能够去追踪源码,找到问题所在,也是我们开发人员的必备技能之一。
一、与WEB集成的配置
还记得吗,以前我们在没有与WEB环境进行集成的时候,为了生成SecurityManager对象,是通过手动读取配置文件生成工厂对象,再通过工厂对象获取到SecurityManager的。就像下面代码展示的那样。
不过,现在我们既然说要与WEB集成,那么首先要做的事情就是把我们的shiro.ini这个配置文件交付到WEB环境中。SO,让我们忘记那些复杂的配置,重写编写一份HelloWorld级别的Shiro.ini配置文件。帐号jay,密码123。此人是一个coder角色,所以拥有code:insert、code:update两种权限。
#shiro.ini配置文件
#帐号jay,密码123。此人是一个coder角色
#所以拥有code:insert、code:update两种权限
[users]
jay=123,coder
[roles]
coder=code:insert,code:update
该如何把shiro.ini配置文件放到WEB环境中呢?首先,我们需要引入shiro的相关依赖。最下面的org.apache.shiro.shiro-web的依赖包是我们今天的主角。
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
引入了Shiro的依赖以后,我们需要在web.xml中配置一些关于Shiro的东西。下面的配置中,首先配置两个服务器的全局变量。shiroEnvironmentClass变量用于指定初始化SecurityManager的环境,shiroConfigLocations用于指定shiro的配置文件的位置。
shiroEnvironmentClass变量对应的值是IniWebEnvironment。它是用来干嘛的呢?请看下面的那个监听器,它是用于在服务器启动的时候,去初始化一个Shiro环境,即创建一个IniWebEnvironment对象。我们先通过读取shiroEnvironmentClass变量的值,初始化一个shiro环境,然后再创建一个SecurityManager对象绑定给我们的shiro环境。稍后你可以在源码追踪环节里面看到相关代码。不过此时你需要关注一下如何再web.xml中配置它们。
<!-- 初始化SecurityManager对象所需要的环境-->
<context-param>
<param-name>shiroEnvironmentClass</param-name>
<param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value>
</context-param>
<!-- 指定Shiro的配置文件的位置 -->
<context-param>
<param-name>shiroConfigLocations</param-name>
<param-value>classpath:shiro.ini</param-value>
</context-param>
<!-- 监听服务器启动时,创建shiro的web环境。
即加载shiroEnvironmentClass变量指定的IniWebEnvironment类-->
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<!-- shiro的l拦截入口,拦截一切请求 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<!-- 拦截所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
上述配置完毕,与我们的WEB集成就结束了,是不是很简单。好了,配置虽然简单,但是Shiro到底做了什么操作呢?让我们一起去探索一下吧。
二、SecurityManager对象的生成
根据上面的论述,我们知道SecurityManager对象会在监听器里面生成。现在就让我们一探究竟。
(1)我启动了服务器,监听器捕获到了服务器启动事件。我现在所处的位置EnvironmentLoaderListener监听器的入口处。
(2)进入方法内查看,它先根据我们的shiroEnvironmentClass变量的值org.apache.shiro.web.env.IniWebEnvironment,初始化一个shiro环境对象。
(3)最后在创建一个SecurityManager对象,再将其绑定到刚才通过字节码创建的Shiro环境对象中。
三、源码下载
本章节项目源码:点击我下载源码
----------------------------------------------------分割线-------------------------------------------------------
阅读更多:跟着大宇学Shiro目录贴