Hi Les.
I explain test cases.
1. Mutual dependency (I assume the confused design)
You can use spring configuration i written before.
But full spring configuration is ...
<!-- =========================================================
Shiro Core Components - Not Spring Specific
========================================================= -->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="cacheManager" ref="cacheManager"/>
<property name="sessionMode" value="native"/>
<property name="sessionManager" ref="sessionManager"/>
<property name="realm" ref=*"$You do modify"*/>
</bean>
<bean id="sessionManager"
class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionDAO">
<bean
class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"/>
</property>
<property name="sessionValidationScheduler"
ref="sessionValidationScheduler"/>
<property name="globalSessionTimeout" value="15000"/>
<property name="sessionListeners">
<list>
<ref local="p2pSessionListener"/>
</list>
</property>
</bean>
<bean id="sessionValidationScheduler"
class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
<property name="sessionManager" ref="sessionManager"/>
<property name="interval" value="30000"/>
</bean>
<bean id="p2pSessionListener"
class="com.acme.session.P2PShiroSessionListenerAdapter"/>
<bean id="cacheManager"
class="org.apache.shiro.cache.ehcache.EhCacheManager">
</bean>
<!-- =========================================================
Shiro Spring-specific integration
========================================================= -->
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean
class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="unauthorizedUrl" value="/unauthorized.html"/>
<property name="filterChainDefinitions">
<value>
/web/** = anon
/secure/** = authcBasic
</value>
</property>
</bean>
<!-- End -->
* com.acme.session.P2PShiroSessionListenerAdapter
package com.acme.session;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class P2PShiroSessionListenerAdapter
implements SessionListener, ApplicationContextAware
{
//
-------------------------------------------------------------------------
// Constant
//
-------------------------------------------------------------------------
private static final Logger logger =
LoggerFactory.getLogger(P2PShiroSessionListenerAdapter.class);
//
-------------------------------------------------------------------------
// Member variable
//
-------------------------------------------------------------------------
private ApplicationContext applicationContext;
//-------------------------------------------------------------------------
// Setter methods for dependency injection
//-------------------------------------------------------------------------
//
-------------------------------------------------------------------------
// Public methods
//
-------------------------------------------------------------------------
@Override
public void onExpiration(Session _session)
{
logger.debug("sessionDestroyed[{}]", _session.getId());
}
@Override
public void onStart(Session _sessioin)
{
logger.debug("onStart");
}
@Override
public void onStop(Session _sessioin)
{
logger.debug("onStop");
}
@Override
public void setApplicationContext(ApplicationContext _applicationContext)
throws BeansException
{
this.applicationContext = _applicationContext;
}
}
2. (Too)Many SessionValidationScheduler Launched.(I assume a bug.)
I develop iPhone application(Object-C, Client) an Spring/J2EE(Server).
So i can't help you with my client code. Sorry.
But i attach log4j logs and client request. (I use HTTP Basic
Authentification.)
lo4j log (2 request concurrently. sessionValidationScheduler.interval is 30
seconds)
2011-08-30 18:10:52 INFO AbstractValidatingSessionManager.?(?) | Enabling
session validation scheduler...
2011-08-30 18:10:52 INFO AbstractValidatingSessionManager.?(?) | Enabling
session validation scheduler...
2011-08-30 18:10:52 INFO EhCacheManager.?(?) | Using existing EHCache named
[shiro-activeSessionCache]
2011-08-30 18:10:52 INFO EhCacheManager.?(?) | Using existing EHCache named
[shiro-activeSessionCache]
2011-08-30 18:10:53 DEBUG P2PShiroSessionListenerAdapter.?(?) | onStart
2011-08-30 18:10:53 DEBUG P2PShiroSessionListenerAdapter.?(?) | onStart
2011-08-30 18:11:22 INFO AbstractValidatingSessionManager.?(?) | Validating
all active sessions...
2011-08-30 18:11:22 INFO AbstractValidatingSessionManager.?(?) | Validating
all active sessions...
2011-08-30 18:11:22 DEBUG P2PShiroSessionListenerAdapter.?(?) | onStop
2011-08-30 18:11:22 DEBUG P2PShiroSessionListenerAdapter.?(?) |
sessionDestroyed[d0884088-47ac-4138-bc83-2258386373a3]
2011-08-30 18:11:22 DEBUG P2PShiroSessionListenerAdapter.?(?) |
sessionDestroyed[b236ba53-c802-4acf-b006-7cf2e2a62393]
2011-08-30 18:11:22 DEBUG P2PShiroSessionListenerAdapter.?(?) | onStop
2011-08-30 18:11:22 INFO AbstractValidatingSessionManager.?(?) | Finished
session validation. [2] sessions were stopped.
2011-08-30 18:11:22 INFO AbstractValidatingSessionManager.?(?) | Finished
session validation. [2] sessions were stopped.
2011-08-30 18:11:52 INFO AbstractValidatingSessionManager.?(?) | Validating
all active sessions...
2011-08-30 18:11:52 INFO AbstractValidatingSessionManager.?(?) | Finished
session validation. No sessions were stopped.
2011-08-30 18:11:52 INFO AbstractValidatingSessionManager.?(?) | Validating
all active sessions...
2011-08-30 18:11:52 INFO AbstractValidatingSessionManager.?(?) | Finished
session validation. No sessions were stopped.
....
Client Request (2 request. It is a normal situation)
HTTP 291 POST /s/q HTTP/1.1 (application/x-www-form-urlencoded)
HTTP 81 POST /s/q HTTP/1.1 (application/x-www-form-urlencoded)
HTTP 181 HTTP/1.1 401 Unauthorized
HTTP 181 HTTP/1.1 401 Unauthorized
HTTP 291 POST /s/q HTTP/1.1 (application/x-www-form-urlencoded)
HTTP 81 POST /s/q HTTP/1.1 (application/x-www-form-urlencoded)
HTTP 56 HTTP/1.1 200 OK (text/html)
HTTP 56 HTTP/1.1 200 OK (text/html)
I understand two session creation because 2 concurrent request.
I don't understand two SessionValidationScheduler.
Thanks.
On Tue, Aug 30, 2011 at 5:38 AM, Les Hazlewood <[email protected]>wrote:
> Hi Jason,
>
> Do you have a sample app or test case that you could share with us?
> Or is it as simple as just using the Spring configuration pasted?
>
> That is, how do I recreate the problem for testing?
>
> Thanks,
>
> Les
>
> On Sun, Aug 28, 2011 at 11:27 PM, Jason Shim <[email protected]> wrote:
> > (sorry my poor english)
> > 1. Mutual dependency (I assume the confused design)
> > SessionManager and SessionValidationScheduler configuration have to do
> set
> > mutual
> > <bean id="sessionManager"
> > class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
> > <property name="sessionDAO">
> > <bean
> > class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"/>
> > </property>
> > <property name="sessionValidationScheduler"
> > ref="sessionValidationScheduler"/>
> > <property name="globalSessionTimeout" value="300000"/>
> > <property name="sessionListeners">
> > <list>
> > <ref local="p2pSessionListener"/>
> > </list>
> > </property>
> > </bean>
> >
> > <bean id="sessionValidationScheduler"
> >
> >
> class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
> > <property name="sessionManager" ref="sessionManager"/>
> > <property name="interval" value="60000"/>
> > </bean>
> > Anyone missing, doesn't execute sessionValidationScheduler.
> > 2. (Too)Many SessionValidationScheduler Launched.(I assume a bug.)
> > I guess, session validation scenario is...
> > (a) Server start
> > (b) Client access
> > (c) Enabling session validation scheduler...
> > (d) Session create
> > If two clients access concurrently in (b), SessionValidationScheduler
> > launched two instance.
> > Three clients, three SessionValidationScheduler launched. (according to
> > logs)
> >
> > Thanks.
>