(例子+源码 http://my.oschina.net/smile622/blog/203459)
最近整合JFinal和Shiro遇到的问题,希望能给你们提示与帮助。
首先,JFinal和Shiro本人都是刚刚接触,JFinal上手很快,但Shiro上手比较费劲,看了很长时间的文档。
下面说一下整合JFinal配置这里就不说了。
按照官方Shiro配置
1、添加shiro-all-1.2.1.jar 包括Shiro所依赖的jar包commons-beanutils-1.8.3.jar、commons-logging-1.1.3.jar和ehcache-core-2.6.6.jar
2、配置web.xml
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<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>
3、配置Shiro.ini (该文件Shiro默认读取路径为classpath)
[main]
#realm
myRealm = com.myweb.ext.shiro.MyShiroRealm
securityManager.realm = $myRealm
#cache
shiroCacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
shiroCacheManager.cacheManagerConfigFile = classpath:ehcache-shiro.xml
securityManager.cacheManager = $shiroCacheManager
#session
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionDAO.activeSessionsCacheName = shiro-activeSessionCache
sessionManager.sessionDAO = $sessionDAO
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 360000
这里自己重写一个MyShiroRealm,没有使用默认的ehcache.xml,原因是怕有缓存名称冲突,我的echcache-shiro.xml
<ehcache name="shiro">
<diskStore path="java.io.tmpdir/shiro-ehcache"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
<cache name="myRealm.authorizationCache"
maxElementsInMemory="10000"
overflowToDisk="true"
eternal="true"
timeToLiveSeconds="0"
timeToIdleSeconds="0"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="600">
</cache>
<cache name="shiro-activeSessionCache"
maxElementsInMemory="10000"
overflowToDisk="true"
eternal="true"
timeToLiveSeconds="0"
timeToIdleSeconds="0"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="600"/>
</ehcache>
其实这样在JFinal就整合好了Shiro,剩下的就是在开发过程中使用Shiro了。
下面说一下整合工程中我遇到的问题
在配置过程中我遇到的问题是缓存异常:
起初Shiro与JFinal整合的时候自己写一个ShiroPlugin.class
public class ShiroPlugin implements IPlugin {
@Override
public boolean start() {
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager); return true; } @Override public boolean stop() { return false; } }
然后在JFinal配置类中添加了
me.add(new ShiroPlugin());
就是因为这一段代码困扰了我很长的时间,起初以为是自己shiro配置不对,其实在启动项目的时候shiro已经默认启动好了,如果JFinal再加载shiro,那么会出现ehcache异常,提示ehcache已经存在不能创建,虽然再该问题上我话了很长的时间,但对shiro有了更深的认识,分享一下能给你带来帮助。