第六节 与WEB集成原理分析

x33g5p2x  于2021-12-18 转载在 其他  
字(2.9k)|赞(0)|评价(0)|浏览(221)

前言

      本小节仅仅是分析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环境对象中。

三、源码下载

      本章节项目源码:点击我下载源码 

相关文章