有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spring web app的java Shiro会话管理

我有一个需要部署在多台服务器上的web应用程序。我想利用shiros会话管理将会话持久化到外部数据存储中。我已经完成了文档中的所有工作,但不知何故,我的SpringBean并没有在请求之间持久化,因此我最终在我在上一个请求中初始化的对象上得到了一个空指针。下面是我的配置。我正在使用shiro 1.2.4和spring 3.1.4。释放

Spring上下文xml文件:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="cacheManager" ref="sessionCacheManager"/>
    <property name="sessionManager" ref="sessionManager"/>
</bean>

 <bean id="sessionCacheManager" class="com.my.package.SessionCacheManager"/>

<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"/>

<bean id="sessionManager"  class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
    <property name="sessionDAO" ref="sessionDAO"/>
</bean>

下面是我的网站。xml配置:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/my-spring-context.xml</param-value>
</context-param>

<servlet>
    <description>My custom Servlet</description>
    <servlet-name>myservletname</servlet-name>
    <servlet-class>com.my.package.CustomDispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/my-spring-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

我的代码中有流动性:

@Component
@Scope("session")
public class MyClass implements Serializable {}

现在,在我的控制器中,我有如下内容:

@Controller
public class MyController {
   @Autowired
   private MyClass myClass;
}

现在当请求1进来时,我开始上课。setName(“这是一个测试”)我希望它将它保存在会话中的bean中,这样当请求2进入时,我就可以执行myClass。getName()我会得到“这是一个测试”。但当第二个请求进来时,我做我的课程时,事情并不是这样的。getName()返回null。看起来没有任何内容被持久化到会话。我想可能是spring没有正确代理会话,但当我执行SecurityUtils时。getSubject()。getSession并打印shiro会话属性,我看到scopedTarget。myClass是会话中存储的密钥的一部分,但shiro似乎没有正确地持久化它,或者某些配置错误


共 (0) 个答案