shiro的sessionMode为native时,无法获得用户信息

yulei773 发布于 2012/09/06 11:40
阅读 6K+
收藏 2

当前项目是一个基于spring的web应用,使用shiro作为安全框架。

在引入框架,并测试登录后,发现其功能正常,配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
default-lazy-init="true">

	<description>Shiro Security Config</description>
	
	<!-- Shiro Filter -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/login.jsp" />
		<property name="successUrl" value="/home.jsp" />
		<property name="filterChainDefinitions">
        <value>
        		/login.jsp = authc
            /security.jsp = authc
        </value>
    </property>
	</bean>
	
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="jdbcRealm"/>
	</bean>
	
	<bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
		<property name="dataSource" ref="datasource"/>
	</bean>
	
	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</beans>

此时我在登录后的jsp上,写了如下代码以作验证:

<%
 	Enumeration<String> s=session.getAttributeNames(); 
	while(s.hasMoreElements()){ 
		String key = s.nextElement();
		out.println(key);
    out.println(session.getAttribute(key)); 
    out.println("<br>");
	} 

%>
<h2>Hello <%= SecurityUtils.getSubject().getPrincipal() %>!</h2>

其结果为:

org.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEY true 
org.apache.shiro.web.session.HttpServletSession.HOST_SESSION_KEY 127.0.0.1 
org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY yulei 

Hello yulei!

--------------------------------------------------------------------------------------------------

接下来为了使用shiro的分布式session功能,我将配置文件修改为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
default-lazy-init="true">

	<description>Shiro Security Config</description>
	
	<!-- Shiro Filter -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/login.jsp" />
		<property name="successUrl" value="/home.jsp" />
		<property name="filterChainDefinitions">
        <value>
        		/login.jsp = authc
            /security.jsp = authc
        </value>
    </property>
	</bean>
	
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="sessionMode" value="native"/>
		<property name="sessionManager" ref="sessionManager"/>
		<property name="realm" ref="jdbcRealm"/>
		<property name="cacheManager" ref="shiroCacheManager" />
	</bean>
	
	<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  	<property name="sessionDAO" ref="sessionDAO"/>
  </bean>
  
  <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
  </bean>
  
	<bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
  </bean>  
  
	<bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
		<property name="dataSource" ref="datasource"/>
	</bean>
	
	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</beans>

然后再登录的时候,仅仅登录验证通过了,再点击受保护的网页,会自动跳转到login页面,说明当前用户未被记住。

还是访问刚刚那个测试页面,得到这样的结果:

Hello null!

看了web容器中的session这会儿是空的,因为shiro的sessionMode是“本地”的,没有用容器的session.

但是,貌似它也没有用它自己的session,获得不到当前的用户?

请大家帮忙看下,有没有遇到类似的情况?

 

 

 

加载中
0
lixuenong
lixuenong

我也碰到你这种问题,不知你有没有解决了?

0
lixuenong
lixuenong

哈哈,我解决了,用了jsp的话。默认还创建httpSession,需要在jsp页面上<%@ page session="false" %>

jackliang
jackliang
这个办法还是没有效果的!!
0
leon_rock
leon_rock
在用户登录后把该sessionID保存到cookies中,暂时不会有sessionid变化的问题,
currentuser.login(token);

setCookie("JSESSIONID", (String) currentuser.getSession().getId(),9999999);

当你认证通过后确保记住通过后的sessionID,保存到cookies中。

0
jackliang
jackliang
修改菜单和权限以后将清空用户关联权限认证,就会出现Session close的异常!
0
淡若悠然
楼主解决问题了吗?麻烦分享一下
返回顶部
顶部