shiro配置文件路径问题的探索

Shiro是一个简单、开源且强大的安全管理框架,是实现单点登录的理想选择,常被应用于java web应用中。

在java web中使用shiro时,可以使用一个INI文件对shiro进行配置,这仅需要在web.xml中配置一下IniShiroFilter的一个参数configPath,然而在配置时,文件的路径问题却出来了,例如,我将shiro.ini文件放在/WEB-INF文件夹下面,然后再web.xml中配置如下:

    <filter> 
        <filter-name>ShiroFilter</filter-name>
        <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
        <init-param>
            <param-name>configPath</param-name>
            <param-value>/WEB-INF/shiro.ini</param-value>
        </init-param> 
    </filter> 
    <filter-mapping>   
        <filter-name>ShiroFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping> 

在部署时,会提示找不着shiro.ini文件。注意,我使用的环境是netbeans 7.0.1+ glassfish 3.1 。

究其原因,我直接找到了IniShiroFilter的源码,其在初始化时,会调用ini(),ini()调用configure(),configure()又调用loadIniFromConfig()或者loadIniFromPath(),其中前者对应IniShiroFilter的另一个参数config,后者对应参数configPath,继续查loadIniFromPath(),发现它又调用convertPathToIni(),convertPathToIni()接着又调用ini.loadFromPath(),至此跳出了IniShiroFilter的函数调用;继续查ini类,打开其源码,找到loadFromPath(),它又调用ResourceUtils.getInputStreamForPath(),找到ResourceUtils类的getInputStreamForPath()方法,源码如下:

    public static InputStream getInputStreamForPath(String resourcePath) throws IOException {

        InputStream is;
        if (resourcePath.startsWith(CLASSPATH_PREFIX)) {
            is = loadFromClassPath(stripPrefix(resourcePath));

        } else if (resourcePath.startsWith(URL_PREFIX)) {
            is = loadFromUrl(stripPrefix(resourcePath));

        } else if (resourcePath.startsWith(FILE_PREFIX)) {
            is = loadFromFile(stripPrefix(resourcePath));

        } else {
            is = loadFromFile(resourcePath);
        }

        if (is == null) {
            throw new IOException("Resource [" + resourcePath + "] could not be found.");
        }

        return is;
    }

web.xml中配置的configPath参数的路径值被传递到了resourcePath参数,却发现其分3类情况处理,分别是CLASSPATH、URL、FILE三种位置,且路径格式有特殊规定:

    /**
     * Resource path prefix that specifies to load from a classpath location, value is <b>{@code classpath:}</b>
     */
    public static final String CLASSPATH_PREFIX = "classpath:";
    /**
     * Resource path prefix that specifies to load from a url location, value is <b>{@code url:}</b>
     */
    public static final String URL_PREFIX = "url:";
    /**
     * Resource path prefix that specifies to load from a file location, value is <b>{@code file:}</b>
     */
    public static final String FILE_PREFIX = "file:";

至此,我们知道,其路径需要一个前缀,如果是使用类路径,则在前面加classpath:,比如 classpath:shiro.ini,如果使用文件路径,则在前面加file:,比如 e:\shiro.ini,如果使用网路路径,同样在前面加url:,如url:http://www.xxx.com/shiro.ini,如果没有前缀,则默认是使用文件路径。

那为什么,我们使用文件路径/WEB-INF/shiro.ini又不对呢?

于是,我使用java创建一个文件,代码如下:

    private void createFile(String uri){
        try {
            File file = new File(uri);
            if (!file.exists()) {
                if (!file.createNewFile()) {
                    throw new Exception("文件不存在,创建失败!");
                }
            }            
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

调用createFile("222.ini")时,发现222.ini文件被创建在glassfish的域目录根目录下面,也就是C:\glassfish-3.1.1\glassfish\domains\domain1下。

调用createFile("/222.ini")时,这个文件被创建在c:\根目录下。

终于明白了,原来是netbeans捣的鬼,在调试时,netbeans会将项目文件部署到glassfish的域中去,如果直接在JAVA代码中使用路径,则都是相对域进行的。

其实这也是shiro 1.1的不足之处,shiro在配置路径参数时,没有对该路径进行处理,而是直接将路径传递过去。

后又在http://shiro.apache.org/web.html中发现这样一句话:

ServletContext resource paths - Shiro 1.2+
ServletContext resource paths are an upcoming feature in Shiro 1.2. Until 1.2 has been released, all configPath definitions must specify a classpath:, file: or url: prefix.

ServletContext 资源路径是一个即将在1.2中实现的特性,在1.2发布之前,所有configPath参数的定义,必须指定classpath:, file: or url:中的一个前缀。

期待shiro1.2能尽快发布!!!

另外

1、使用classpath:前缀的时候,可将shiro.ini拷贝到C:\glassfish-3.1.1\glassfish\domains\domain1\lib下即可,或者使用包目录,如:classpath:cn/org/lycz/www/mb/shiro.ini。

2、IniShiroFilter还有一个参数config,可以将shiro.ini中的内容直接写在web.xml中,如:

    <filter> 
        <filter-name>ShiroFilter</filter-name>
        <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>
               [users]
               zwx=zavens
            </param-value>
        </init-param> 
    </filter> 
    <filter-mapping>   
        <filter-name>ShiroFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值