Shiro是一个简单、开源且强大的安全管理框架,是实现单点登录的理想选择,常被应用于java web应用中。
在java web中使用shiro时,可以使用一个INI文件对shiro进行配置,这仅需要在web.xml中配置一下IniShiroFilter的一个参数configPath
注:红字中的配置可能会找不到shiro.ini文件
IniShiroFilter在shiro1.2中这个过滤器@Deprecated, 改用ShiroFilter
其在初始化时,会调用ini()方法,ini()调用configure(),configure()又调用loadIniFromConfig()或者loadIniFromPath(),其中前者对应IniShiroFilter的另一个参数config,后者对应参数configPath,继续查loadIniFromPath(),发现它又调用convertPathToIni(),convertPathToIni()接着又调用ini.loadFromPath(),至此跳出了IniShiroFilter的函数调用;继续查ini类,打开其源码,找到loadFromPath(),它又调用ResourceUtils.getInputStreamForPath(),找到ResourceUtils类的getInputStreamForPath()方法
至此,我们知道,其路径需要一个前缀,如果是使用类路径,则在前面加classpath:,比如 classpath:shiro.ini,如果使用文件路径,则在前面加file:,比如 e:\shiro.ini,
如果使用网路路径,同样在前面加url:,如url:http://www.xxx.com/shiro.ini,如果没有前缀,则默认是使用文件路径。
在java web中使用shiro时,可以使用一个INI文件对shiro进行配置,这仅需要在web.xml中配置一下IniShiroFilter的一个参数configPath
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
<init-param>
<param-name>configPath</param-name>
<span class="bold" style="color: #ff0000;"> <param-value>/WEB-INF/shiro.ini</param-value> </span> </init-param>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注:红字中的配置可能会找不到shiro.ini文件
IniShiroFilter在shiro1.2中这个过滤器@Deprecated, 改用ShiroFilter
其在初始化时,会调用ini()方法,ini()调用configure(),configure()又调用loadIniFromConfig()或者loadIniFromPath(),其中前者对应IniShiroFilter的另一个参数config,后者对应参数configPath,继续查loadIniFromPath(),发现它又调用convertPathToIni(),convertPathToIni()接着又调用ini.loadFromPath(),至此跳出了IniShiroFilter的函数调用;继续查ini类,打开其源码,找到loadFromPath(),它又调用ResourceUtils.getInputStreamForPath(),找到ResourceUtils类的getInputStreamForPath()方法
public void init() throws Exception {
applyInitParams();
configure();
}
protected void configure() throws Exception {
Ini ini = loadIniFromConfig();
if (CollectionUtils.isEmpty(ini)) {
log.info("Null or empty configuration specified via 'config' init-param. " +
"Checking path-based configuration.");
ini = loadIniFromPath();
}
......
}
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;
}
至此,我们知道,其路径需要一个前缀,如果是使用类路径,则在前面加classpath:,比如 classpath:shiro.ini,如果使用文件路径,则在前面加file:,比如 e:\shiro.ini,
如果使用网路路径,同样在前面加url:,如url:http://www.xxx.com/shiro.ini,如果没有前缀,则默认是使用文件路径。