<a name="SessionManagement-SessionManagement"></a>
#[[#Session Management]]#

*   [Using Sessions](#SessionManagement-UsingSessions)
*   [The SessionManager](#SessionManagement-TheSessionManager)

    *   [Session Timeout](#SessionManagement-SessionTimeout)

        *   [Per-Session Timeout](#SessionManagement-PerSessionTimeout)
    
    *   [Session Listeners](#SessionManagement-SessionListeners)
    *   [Session Storage](#SessionManagement-SessionStorage)
    
        *   [EHCache SessionDAO](#SessionManagement-EHCacheSessionDAO)
        
            *   [EHCache Session Cache Configuration](#SessionManagement-EHCacheSessionCacheConfiguration)
            *   [EHCache Session Cache Name](#SessionManagement-EHCacheSessionCacheName)
    
        *   [Custom Session IDs](#SessionManagement-CustomSessionIDs)
    
    *   [Session Validation & Scheduling](#SessionManagement-SessionValidation%26Scheduling)
    
        *   [Default SessionValidationScheduler](#SessionManagement-DefaultSessionValidationScheduler)
        *   [Custom SessionValidationScheduler](#SessionManagement-CustomSessionValidationScheduler)
        *   [Disabling Session Validation](#SessionManagement-DisablingSessionValidation)
        *   [Invalid Session Deletion](#SessionManagement-InvalidSessionDeletion)

*   [Session Clustering](#SessionManagement-SessionClustering)

    *   [`EnterpriseCacheSessionDAO`](#SessionManagement-%7B%7BEnterpriseCacheSessionDAO%7D%7D)
    *   [Ehcache + Terracotta](#SessionManagement-EhcacheTerracotta)
    *   [Zookeeper](#SessionManagement-Zookeeper)

*   [Sessions and Subject State](#SessionManagement-SessionsandSubjectState)

    *   [Stateful Applications (Sessions allowed)](#SessionManagement-StatefulApplications%28Sessionsallowed%29)
    *   [Stateless Applications (Sessionless)](#SessionManagement-StatelessApplications%28Sessionless%29)

        *   [Disabling Subject State Session Storage](#SessionManagement-DisablingSubjectStateSessionStorage)

    *   [A Hybrid Approach](#SessionManagement-AHybridApproach)

        *   [SessionStorageEvaluator](#SessionManagement-SessionStorageEvaluator)

            *   [Subject Inspection](#SessionManagement-SubjectInspection)

        *   [Configuration](#SessionManagement-Configuration)

    *   [Web Applications](#SessionManagement-WebApplications)


Apache Shiro offers something unique in the world of security frameworks: a complete enterprise-grade Session solution for any application, from the simplest command-line and smart phone applications to the largest clustered enterprise web applications.

This has large implications for many applications - until Shiro, if you required session support, you were required to deploy your application in a web container or use EJB Stateful Session Beans. Shiro's Session support is much simpler to use and manage than either of these two mechanisms, and it is available in any application, regardless of container.

And even if you deploy your application in a Servlet or EJB container, there are still compelling reasons to use Shiro's Session support instead of the container's. Here is a list of the most desirable features provided by Shiro's session support:

**Features**

*   **POJO/J2SE based (IoC friendly)** - Everything in Shiro (including all aspects of Sessions and Session Management) is interface-based and implemented with POJOs. This allows you to easily configure all session components with any JavaBeans-compatible configuration format, like JSON, YAML, Spring XML or similar mechanisms. You can also easily extend Shiro's components or write your own as necessary to fully customize session management functionality.

*   **Easy Custom Session Storage** - Because Shiro's Session objects are POJO-based, session data can be easily stored in any number of data sources. This allows you to customize exactly where your application's session data resides - for example, the file system, in memory, in a networked distributed cache, a relational database, or proprietary data store.

*   **Container-Independent Clustering!** - Shiro's sessions can be easily clustered using any of the readily-available networked caching products, like Ehcache + Terracotta, Coherence, GigaSpaces, et. al. This means you can configure session clustering for Shiro once and only once, and no matter what container you deploy to, your sessions will be clustered the same way. No need for container-specific configuration!

*   **Heterogeneous Client Access** - Unlike EJB or Web sessions, Shiro sessions can be 'shared' across various client technologies. For example, a desktop application could 'see' and 'share' the same physical session used by the same user in a web application. We are unaware of any framework other than Shiro that can support this.

*   **Event Listeners** - Event listeners allow you to listen to lifecycle events during a session's lifetime. You can listen for these events and react to them for custom application behavior - for example, updating a user record when their session expires.

*   **Host Address Retention** – Shiro Sessions retain the IP address or host name of the host from where the session was initiated. This allows you to determine where the user is located and react accordingly (often useful in intranet environments where IP association is deterministic).

*   **Inactivity/Expiration Support** – Sessions expire due to inactivity as expected, but they can be prolonged via a `touch()` method to keep them 'alive' if desired. This is useful in Rich Internet Application (RIA) environments where the user might be using a desktop application, but may not be regularly communicating with the server, but the server session should not expire.

*   **Transparent Web Use** - Shiro's web support fully implements and supports the Servlet 2.5 specification for Sessions (`HttpSession` interface and all of it's associated APIs). This means you can use Shiro sessions in existing web applications and you don't need to change any of your existing web code.

*   **Can be used for SSO** - Because Shiro session's are POJO based, they are easily stored in any data source, and they can be 'shared' across applications if needed. We call this 'poor man's SSO', and it can be used to provide a simple sign-on experience since the shared session can retain authentication state.

<a name="SessionManagement-UsingSessions"></a>
#[[##Using Sessions]]#

Like almost everything else in Shiro, you acquire a `Session` by interacting with the currently executing `Subject`:

``` java
Subject currentUser = SecurityUtils.getSubject();

Session session = currentUser.getSession();
session.setAttribute( "someKey", someValue);
```

The `currentUser.getSession()` method is a shortcut for calling `currentUser.getSession(true)`.

For those familiar with `HttpServletRequest` API, the `Subject.getSession(boolean create)` method functions the same way as the `HttpServletRequest.getSession(boolean create)` method:

*   If the `Subject` already has a `Session`, the boolean argument is ignored and the `Session` is returned immediately
*   If the `Subject` does not yet have a `Session` and the `create` boolean argument is `true`, a new session will be created and returned.
*   If the `Subject` does not yet have a `Session` and the `create` boolean argument is `false`, a new session will not be created and `null` is returned.

#tip('Any Application', '<code>getSession</code> calls work in any application, even non-web applications.')

`subject.getSession(false)` can be used to good effect when developing framework code to ensure a Session isn't created unnecessarily.

Once you acquire a Subject's `Session` you can do many things with it, like set or retrieve attributes, set its timeout, and more. See the [Session JavaDoc](static/current/apidocs/org/apache/shiro/session/Session.html) to see what is possible with an individual session.

<a name="SessionManagement-TheSessionManager"></a>
#[[##The SessionManager]]#

The SessionManager, as its name might imply, manages Sessions for _all_ subjects in an application - creation, deletion, inactivity and validation, etc. Like other core architectural components in Shiro, the `SessionManager` is a top-level component maintained by the `SecurityManager`.

The default `SecurityManager` implementation defaults to using a [`DefaultSessionManager`](static/current/apidocs/org/apache/shiro/mgt/DefaultSecurityManager.html) out of the box. The `DefaultSessionManager` implementation provides all of the enterprise-grade session management features needed for an application, like Session validation, orphan cleanup, etc. This can be used in any application.

#info('Web Applications', 'Web applications use different <code>SessionManager</code> implementations. Please see the <a href="web.html">Web</a> documentation for web-specific Session Management information.')

Like all other components managed by the `SecurityManager`, the `SessionManager` can be acquired or set via JavaBeans-style getter/setter methods on all of Shiro's default `SecurityManager` implementations (`getSessionManager()`/`setSessionManager()`). Or for example, if using `shiro.ini` [Configuration](configuration.html "Configuration"):

**Configuring a new SessionManager in shiro.ini**

``` ini
[main]
...
sessionManager = com.foo.my.SessionManagerImplementation
securityManager.sessionManager = $sessionManager
```

But creating a `SessionManager` from scratch is a complicated task and not something that most people will want to do themselves. Shiro's out-of-the-box `SessionManager` implementations are highly customizable and configurable and will suit most needs. Most of the rest of this documentation assumes that you will be using Shiro's default `SessionManager` implementations when covering configuration options, but note that you can essentially create or plug-in nearly anything you wish.

<a name="SessionManagement-sessionTimeout"></a>
<a name="SessionManagement-SessionTimeout"></a>
#[[###Session Timeout]]#

By default, Shiro's `SessionManager` implementations default to a 30 minute session timeout. That is, if any `Session` created remains idle (unused, where its [`lastAccessedTime`](static/current/apidocs/org/apache/shiro/session/Session.html#[[#]]#getLastAccessTime--) isn't updated) for 30 minutes or more, the `Session` is considered expired and will not be allowed to be used anymore.

You can set the default `SessionManager` implementation's `globalSessionTimeout` property to define the default timeout value for all sessions. For example, if you wanted the timeout to be an hour instead of 30 minutes:

**Setting the Default Session Timeout in shiro.ini**

#[[
``` ini
[main]
...
# 3,600,000 milliseconds = 1 hour
securityManager.sessionManager.globalSessionTimeout = 3600000
```
]]#

<a name="SessionManagement-PerSessionTimeout"></a>
#[[####Per-Session Timeout]]#

The above `globalSessionTimeout` value is the default for all newly created `Sessions`. You can control session timeout on a per-Session basis by setting the individual Session's [`timeout`](static/current/apidocs/org/apache/shiro/session/Session.html#[[#]]#setTimeout-long-) value. Like the above `globalSessionTimeout`, the value is time in **milliseconds** (not seconds).

<a name="SessionManagement-SessionListeners"></a>
#[[###Session Listeners]]#

Shiro supports the notion of a `SessionListener` to allow you to react to important session events as they occur. You can implement the [`SessionListener`](static/current/apidocs/org/apache/shiro/session/SessionListener.html) interface (or extend the convenience [`SessionListenerAdapter`](static/current/apidocs/org/apache/shiro/session/SessionListenerAdapter.html)) and react to session operations accordingly.

As the default `SessionManager` `sessionListeners` property is a collection, you can configure the `SessionManager` with one or more of your listener implementations like any other collection in `shiro.ini`:

**SessionListener Configuration in shiro.ini**

``` ini
[main]
...
aSessionListener = com.foo.my.SessionListener
anotherSessionListener = com.foo.my.OtherSessionListener

securityManager.sessionManager.sessionListeners = $aSessionListener, $anotherSessionListener, etc.
```

#info('All Session Events', '<code>SessionListeners</code> are notified when an event occurs for <i>any</i> session - not just for a particular session.')

<a name="SessionManagement-sessionstorage"></a>
<a name="SessionManagement-SessionStorage"></a>

#[[###Session Storage]]#

Whenever a session is created or updated, its data needs to persisted to a storage location so it is accessible by the application at a later time. Similarly, when a session is invalid and longer being used, it needs to be deleted from storage so the session data store space is not exhausted. The `SessionManager` implementations delegate these Create/Read/Update/Delete (CRUD) operations to an internal component, the [`SessionDAO`](static/current/apidocs/org/apache/shiro/session/mgt/eis/SessionDAO.html), which reflects the [Data Access Object (DAO)](https://en.wikipedia.org/wiki/Data_access_object) design pattern.

The power of the SessionDAO is that you can implement this interface to communicate with _any_ data store you wish. This means your session data can reside in memory, on the file system, in a relational database or NoSQL data store, or any other location you need. You have control over persistence behavior.

You can configure any `SessionDAO` implementation as a property on the default `SessionManager` instance. For example, in shiro.ini:

**Configuring a SessionDAO in shiro.ini**

``` ini
[main]
...
sessionDAO = com.foo.my.SessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO
```

However, as you might expect, Shiro already has some good `SessionDAO` implementations that you can use out of the box or subclass for your own needs.
<a name="SessionManagement-websessionmanagersessiondao"></a>

#warning('Web Applications', 'The above <code>securityManager.sessionManager.sessionDAO = $sessionDAO</code> assignment only works when using a Shiro native session manager. Web applications by default do not use a native session manager and instead retain the Servlet Container''s default session manager which does not support a SessionDAO. If you would like to enable a SessionDAO in a web-based application for custom session storage or session clustering, you will have to first configure a native web session manager. For example:

<div><pre><code class="ini">[main]
...
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager

# Configure a SessionDAO and then set it:
securityManager.sessionManager.sessionDAO = $sessionDAO
</code></pre></div>
')
#danger('Configure a SessionDAO!', 'Shiro''s default configuration native SessionManagers use <strong>in-memory-only</strong> Session storage. This is unsuitable for most production applications. Most production applications will want to either configure the provided EHCache support (see below) or provide their own <code>SessionDAO</code> implementation.

Note that web applications use a servlet-container-based SessionManager by default and do not have this issue. This is only an issue when using a Shiro native SessionManager.')

<a name="SessionManagement-ehcachesessiondao"></a>
<a name="SessionManagement-EHCacheSessionDAO"></a>
#[[####EHCache SessionDAO]]#

EHCache is not enabled by default, but if you do not plan on implementing your own `SessionDAO`, it is **highly** recommended that you enable the EHCache support for Shiro's SessionManagement. The EHCache SessionDAO will store sessions in memory and support overflow to disk if memory becomes constrained. This is highly desirable for production applications to ensure that you don't randomly 'lose' sessions at runtime.

#tip('Use EHCache as your default', 'If you''re not writing a custom <code>SessionDAO</code>, definitely enable EHCache in your Shiro configuration. EHCache can also be beneficial beyond Sessions, caching authentication and authorization data as well. See the <a href="caching.html">Caching</a> documentation for more information.') 
#tip('Container-Independent Session Clustering', 'EHCache is also a nice choice if you quickly need container-independent session clustering. You can transparently plug in <a href="http://www.terracotta.org/">TerraCotta</a> behind EHCache and have a container-independent clustered session cache. No more worrying about Tomcat, JBoss, Jetty, WebSphere or WebLogic specific session clustering ever again!')

Enabling EHCache for sessions is very easy. First, ensure that you have the `shiro-ehcache-<version>.jar` file in your classpath (see the [Download](download.html "Download") page or use Maven or Ant+Ivy).

Once in the classpath, this first `shiro.ini` example shows you how to use EHCache for all of Shiro's caching needs (not just Session support):

**Configuring EHCache for all of Shiro's caching needs in shiro.ini**

``` ini
[main]

sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO

cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
securityManager.cacheManager = $cacheManager
```

The final line, `securityManager.cacheManager = $cacheManager`, configures a `CacheManager` for all of Shiro's needs. This `CacheManager` instance will propagate down to the `SessionDAO` automatically (by nature of `EnterpriseCacheSessionDAO` implementing the [`CacheManagerAware`](static/current/apidocs/org/apache/shiro/cache/CacheManagerAware.html) interface).

Then, when the `SessionManager` asks the `EnterpriseCacheSessionDAO` to persist a `Session`, it will use an EHCache-backed [`Cache`](static/current/apidocs/org/apache/shiro/cache/Cache.html) implementation to store the Session data.

#info('Web Applications', 'Don''t forget that assigning a <code>SessionDAO</code> is a feature when using Shiro native SessionManager implementations. Web applications by default use a Servlet container-based SessionManager which does not support a <code>SessionDAO</code>. Configure a native web SessionManager as <a href="#SessionManagement-websessionmanagersessiondao">explained above</a> if you want to use Ehcache-based session storage in a web application.')

<a name="SessionManagement-ehcachesessioncacheconfiguration"></a>
<a name="SessionManagement-EHCacheSessionCacheConfiguration"></a>
#[[#####EHCache Session Cache Configuration]]#

By default, the `EhCacheManager` uses a Shiro-specific [`ehcache.xml`](https://github.com/apache/shiro/blob/main/support/ehcache/src/main/resources/org/apache/shiro/cache/ehcache/ehcache.xml) file that sets up the Session cache region and the necessary settings to ensure Sessions are stored and retrieved properly.

However, if you wish to change the cache settings, or configure your own `ehcache.xml` or EHCache `net.sf.ehcache.CacheManager` instance, you will need to configure the cache region to ensure that Sessions are handled correctly.

If you look at the default [`ehcache.xml`](https://github.com/apache/shiro/blob/main/support/ehcache/src/main/resources/org/apache/shiro/cache/ehcache/ehcache.xml) file, you will see the following `shiro-activeSessionCache` cache configuration:

``` xml
<cache name="shiro-activeSessionCache"
       maxElementsInMemory="10000"
       overflowToDisk="true"
       eternal="true"
       timeToLiveSeconds="0"
       timeToIdleSeconds="0"
       diskPersistent="true"
       diskExpiryThreadIntervalSeconds="600"/>
```

If you wish to use your own `ehcache.xml` file, ensure that you have defined a similar cache entry for Shiro's needs. Most likely you might change the `maxElementsInMemory` attribute value to meet your needs. However, it is very important that at least the following two attributes exist (and are not changed) in your own configuration:

*   `overflowToDisk="true"` - this ensures that if you run out of process memory, sessions won't be lost and can serialized to disk
*   `eternal="true"` - ensures that cache entries (Session instances) are never expired or expunged automatically by the cache. This is necessary because Shiro does its own validation based on a scheduled process (see "Session Validation & Scheduling" below). If we turned this off, the cache would likely evict Sessions without Shiro knowing about it, which could cause problems.

<a name="SessionManagement-EHCacheSessionCacheName"></a>
#[[#####EHCache Session Cache Name]]#

By default, the `EnterpriseCacheSessionDAO` asks the `CacheManager` for a `Cache` named "`shiro-activeSessionCache`". This cache name/region is expected to be configured in `ehcache.xml`, as mentioned above.

If you want to use a different name instead of this default, you can configure that name on the `EnterpriseCacheSessionDAO`, for example:

**Configuring the cache name for Shiro's active session cache in shiro.ini**<

``` ini[main]
...
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionDAO.activeSessionsCacheName = myname
...
```

Just ensure that a corresponding entry in `ehcache.xml` matches that name and you've configured `overflowToDisk="true"` and `eternal="true"` as mentioned above.

<a name="SessionManagement-CustomSessionIDs"></a>
#[[####Custom Session IDs]]#

Shiro's `SessionDAO` implementations use an internal [`SessionIdGenerator`](static/current/apidocs/org/apache/shiro/session/mgt/eis/SessionIdGenerator.html) component to generate a new Session ID every time a new session is created. The ID is generated, assigned to the newly created `Session` instance, and then the `Session` is saved via the `SessionDAO`.

The default `SessionIdGenerator` is a [`JavaUuidSessionIdGenerator`](static/current/apidocs/org/apache/shiro/session/mgt/eis/JavaUuidSessionIdGenerator.html), which generates `String` IDs based on Java [`UUIDs`](http://download.oracle.com/javase/6/docs/api/java/util/UUID.html). This implementation is suitable for all production environments.

If this does not meet your needs, you can implement the `SessionIdGenerator` interface and configure the implementation on Shiro's `SessionDAO` instance. For example, in `shiro.ini`:

**Configuring a SessionIdGenerator in shiro.ini**

``` ini
[main]
...
sessionIdGenerator = com.my.session.SessionIdGenerator
securityManager.sessionManager.sessionDAO.sessionIdGenerator = $sessionIdGenerator
```

<a name="SessionManagement-SessionValidation%26Scheduling"></a>
#[[###Session Validation & Scheduling]]#

Sessions must be validated so any invalid (expired or stopped) sessions can be deleted from the session data store. This ensures that the data store does not fill up over time with sessions that will never be used again.

For performance reasons, `Sessions` are only validated to see if they have been stopped or expired at the time they are accessed (i.e. `subject.getSession()`). This means that without additional regular periodic validation, `Session` orphans would begin to fill up the session data store.

A common example illustrating orphans is the web browser scenario: Let's say a user logs in to a web application and a session is created to retain data (authentication state, shopping cart, etc). If the user does not log out and closes their browser without the application knowing about it, their session is essentially just 'lying around' (orphaned) in the session data store. The `SessionManager` has no way of detecting that the user was no longer using their browser, and the session is never accessed again (it is orphaned).

Session orphans, if they are not regularly purged, will fill up the session data store (which would be bad). So, to prevent orphans from piling up, the `SessionManager` implementations support the notion of a [`SessionValidationScheduler`](static/current/apidocs/org/apache/shiro/session/mgt/SessionValidationScheduler.html). A `SessionValidationScheduler` is responsible for validating sessions at a periodic rate to ensure they are cleaned up as necessary.

<a name="SessionManagement-DefaultSessionValidationScheduler"></a>
#[[####Default SessionValidationScheduler]]#

The default `SessionValidationScheduler` usable in all environments is the [`ExecutorServiceSessionValidationScheduler`](static/current/apidocs/org/apache/shiro/session/mgt/ExecutorServiceSessionValidationScheduler.html) which uses a JDK [`ScheduledExecutorService`](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html) to control how often the validation should occur.

By default, this implementation will perform validation once per hour. You can change the rate at which validation occurs by specifying a **new** instance of `ExecutorServiceSessionValidationScheduler` and specifying a different interval (in milliseconds):

**ExecutorServiceSessionValidationScheduler interval in shiro.ini**

#[[
``` ini
[main]
...
sessionValidationScheduler = org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler
# Default is 3,600,000 millis = 1 hour:
sessionValidationScheduler.interval = 3600000

securityManager.sessionManager.sessionValidationScheduler = $sessionValidationScheduler
```
]]#

<a name="SessionManagement-CustomSessionValidationScheduler"></a>
#[[####Custom SessionValidationScheduler]]#

If you wish to provide a custom `SessionValidationScheduler` implementation, you can specify it as a property of the default `SessionManager` instance. For example, in `shiro.ini`:

**Configuring a custom SessionValidationScheduler in shiro.ini**

``` ini
[main]
...
sessionValidationScheduler = com.foo.my.SessionValidationScheduler
securityManager.sessionManager.sessionValidationScheduler = $sessionValidationScheduler
```

<a name="SessionManagement-DisablingSessionValidation"></a>
#[[####Disabling Session Validation]]#

In some cases, you might wish to disable session validation entirely because you have set up a process outside of Shiro's control to perform the validation for you. For example, maybe you are using an enterprise Cache and rely on the cache's Time To Live setting to automatically expunge old sessions. Or maybe you've set up a cron job to auto-purge a custom data store. In these cases you can turn off session validation scheduling:

**Disabling Session Validation Scheduling in shiro.ini**

``` ini
[main]
...
securityManager.sessionManager.sessionValidationSchedulerEnabled = false
```

Sessions will still be validated when they are retrieved from the session data store, but this will disable Shiro's periodic validation.

#danger('Enable Session Validation <i>somewhere</i>', 'If you turn off Shiro''s session validation scheduler, you <i>MUST</i> perform periodic session validation via some other mechanism (cron job, etc.). This is the only way to guarantee Session orphans do not fill up the data store.')

<a name="SessionManagement-InvalidSessionDeletion"></a>
#[[####Invalid Session Deletion]]#

As we've stated above, the purpose of periodic session validation is mainly to delete any invalid (expired or stopped) sessions to ensure they do not fill up the session data store.

By default, whenever Shiro detects an invalid session, it attempts to delete it from the underlying session data store via the `SessionDAO.delete(session)` method. This is good practice for most applications to ensure the session data storage space is not exhausted.

However, some applications may not wish for Shiro to automatically delete sessions. For example, if an application has provided a `SessionDAO` that backs a queryable data store, perhaps the application team wishes old or invalid sessions to be available for a certain period of time. This would allow the team to run queries against the data store to see, for example, how many sessions a user has created over the last week, or the average duration of a user's sessions, or similar reporting-type queries.

In these scenarios, you can turn off invalid session deletion entirely. For example, in `shiro.ini`:

**Disabling Invalid Session Deletion in shiro.ini**

``` ini
[main]
...
securityManager.sessionManager.deleteInvalidSessions = false
```

But be careful! If you turn this off, you are responsible for ensuring that your session data store doesn't exhaust its space. You must delete invalid sessions from you data store yourself!

Note also that even if you prevent Shiro from deleting invalid sessions, you still should enable session validation somehow - either via Shiro's existing validation mechanisms or via a custom mechanism you provide yourself (see the above "Disabling Session Validation" section above for more). The validation mechanism will update your session records to reflect the invalid state (e.g. when it was invalidated, when it was last accessed, etc), even if you will delete them manually yourself at some other time.

<div class="panelMacro">

#danger('Warning', 'If you configure Shiro so it does not delete invalid sessions, you are responsible for ensuring that your session data store doesn''t exhaust its space. You must delete invalid sessions from you data store yourself!
<p>Also note that disabling session deletion is <strong>not</strong> the same as disabling session validation scheduling. You should almost always use a session validation scheduling mechanism - either one supported by Shiro directly or your own.</p>')


<a name="SessionManagement-SessionClustering"></a>
#[[##Session Clustering]]#

One of the very exciting things about Apache Shiro's session capabilities is that you can cluster Subject sessions natively and never need to worry again about how to cluster sessions based on your container environment. That is, if you use Shiro's native sessions and configure a session cluster, you can, say, deploy to Jetty or Tomcat in development, JBoss or Geronimo in production, or any other environment - all the while never worrying about container/environment-specific clustering setup or configuration. Configure session clustering once in Shiro and it works no matter your deployment environment.

So how does it work?

Because of Shiro's POJO-based N-tiered architecture, enabling Session clustering is as simple as enabling a clustering mechanism at the Session persistence level. That is, if you configure a cluster-capable [`SessionDAO`](#SessionManagement-sessionstorage), the DAO can interact with a clustering mechanism and Shiro's `SessionManager` never needs to know about clustering concerns.

**Distributed Caches**

Distributed Caches such as [Ehcache+TerraCotta](http://www.ehcache.org/documentation/2.7/configuration/distributed-cache-configuration.html), [GigaSpaces](http://www.gigaspaces.com/) [Oracle Coherence](http://www.oracle.com/technetwork/middleware/coherence/overview/index.html), and [Memcached](http://memcached.org/) (and many others) already solve the distributed-data-at-the-persistence-level problem. Therefore enabling Session clustering in Shiro is as simple as configuring Shiro to use a distributed cache.

This gives you the flexibility of choosing the exact clustering mechanism that is suitable for _your_ environment.

#warning('Cache Memory', 'Note that when enabling a distributed/enterprise cache to be your session clustering data store, one of the following two cases must be true:
<ul><li>The distributed cache has enough cluster-wide memory to retain _all_ active/current sessions</li>
<li>If the distributed cache does not have enough cluster-wide memory to retain all active sessions, it must support disk overflow so sessions are not lost.</li></ul>
Failure for the cache to support either of the two cases will result in sessions being randomly lost, which would likely be frustrating to end-users.
')

<a name="SessionManagement-%7B%7BEnterpriseCacheSessionDAO%7D%7D"></a>
#[[###`EnterpriseCacheSessionDAO`]]#

As you might expect, Shiro already provides a `SessionDAO` implementation that will persist data to an enterprise/distributed Cache. The [EnterpriseCacheSessionDAO](static/current/apidocs/org/apache/shiro/session/mgt/eis/EnterpriseCacheSessionDAO.html) expects a Shiro `Cache` or `CacheManager` to be configured on it so it can leverage the caching mechanism.

For example, in `shiro.ini`:

#[[
``` ini
#This implementation would use your preferred distributed caching product's APIs:
activeSessionsCache = my.org.apache.shiro.cache.CacheImplementation

sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionDAO.activeSessionsCache = $activeSessionsCache

securityManager.sessionManager.sessionDAO = $sessionDAO
```
]]#

Although you could inject a `Cache` instance directly to the `SessionDAO` as shown above, it is usually far more common to configure a general `CacheManager` to use for all of Shiro's caching needs (sessions as well as authentication and authorization data). In this case, instead of configuring a `Cache` instance directly, you would tell the `EnterpriseCacheSessionDAO` the name of the cache in the `CacheManager` that should be used for storing active sessions.

For example:

#[[
``` ini
# This implementation would use your caching product's APIs:
cacheManager = my.org.apache.shiro.cache.CacheManagerImplementation

# Now configure the EnterpriseCacheSessionDAO and tell it what
# cache in the CacheManager should be used to store active sessions:
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
# This is the default value.  Change it if your CacheManager configured a different name:
sessionDAO.activeSessionsCacheName = shiro-activeSessionsCache
# Now have the native SessionManager use that DAO:
securityManager.sessionManager.sessionDAO = $sessionDAO

# Configure the above CacheManager on Shiro's SecurityManager
# to use it for all of Shiro's caching needs:
securityManager.cacheManager = $cacheManager
```
]]#

But there's something a bit strange about the above configuration. Did you notice it?

The interesting thing about this config is that nowhere in the config did we actually tell the `sessionDAO` instance to use a `Cache` or `CacheManager`! So how does the `sessionDAO` use the distributed cache?

When Shiro initializes the `SecurityManager`, it will check to see if the `SessionDAO` implements the [`CacheManagerAware`](static/current/apidocs/org/apache/shiro/cache/CacheManagerAware.html) interface. If it does, it will automatically be supplied with any available globally configured `CacheManager`.

So when Shiro evaluates the `securityManager.cacheManager = $cacheManager` line, it will discover that the `EnterpriseCacheSessionDAO` implements the `CacheManagerAware` interface and call the `setCacheManager` method with your configured `CacheManager` as the method argument.

Then at runtime, when the `EnterpriseCacheSessionDAO` needs the `activeSessionsCache` it will ask the `CacheManager` instance to return it it, using the `activeSessionsCacheName` as the lookup key to get a `Cache` instance. That `Cache` instance (backed by your distributed/enterprise caching product's API) will be used to store and retrieve sessions for all of the `SessionDAO` CRUD operations.

<a name="SessionManagement-EhcacheTerracotta"></a>
#[[###Ehcache + Terracotta]]#

One such distributed caching solution that people have had success with while using Shiro is the Ehcache + Terracotta pairing. See the Ehcache-hosted [Distributed Caching With Terracotta](http://www.ehcache.org/documentation/get-started/about-distributed-cache) documentation for full details of how to enable distributed caching with Ehcache.

Once you've got Terracotta clustering working with Ehcache, the Shiro-specific parts are very simple. Read and follow the [Ehcache SessionDAO](#SessionManagement-ehcachesessiondao) documentation, but we'll need to make a few changes

The Ehcache Session Cache Configuration [referenced previously](#SessionManagement-ehcachesessioncacheconfiguration) will not work - a Terracotta-specific configuration is needed. Here is an example configuration that has been tested to work correctly. Save its contents in a file and save it in an `ehcache.xml` file:

**TerraCotta Session Clustering**

``` xml
<ehcache>
    <terracottaConfig url="localhost:9510"/>
    <diskStore path="java.io.tmpdir/shiro-ehcache"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120">
        <terracotta/>
    </defaultCache>
    <cache name="shiro-activeSessionCache"
           maxElementsInMemory="10000"
           eternal="true"
           timeToLiveSeconds="0"
           timeToIdleSeconds="0"
           diskPersistent="false"
           overflowToDisk="false"
           diskExpiryThreadIntervalSeconds="600">
        <terracotta/>
    </cache>
    <!-- Add more cache entries as desired, for example,
         Realm authc/authz caching: -->
</ehcache>
```

Of course you will want to change your `<terracottaConfig url="localhost:9510"/>` entry to reference the appropriate host/port of your Terracotta server array. Also notice that, unlike the [previous](#SessionManagement-ehcachesessioncacheconfiguration) configuration, the `ehcache-activeSessionCache` element **_DOES NOT_** set `diskPersistent` or `overflowToDisk` attributes to `true`. They should both be `false` as true values are not supported in clustered configuration.

After you've saved this `ehcache.xml` file, we'll need to reference it in Shiro's configuration. Assuming you've made the terracotta-specific `ehcache.xml` file accessible at the root of the classpath, here is the final Shiro configuration that enables Terracotta+Ehcache clustering for all of Shiro's needs (including Sessions):

**shiro.ini for Session Clustering with Ehcache and Terracotta**


#[[
``` ini
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
# This name matches a cache name in ehcache.xml:
sessionDAO.activeSessionsCacheName = shiro-activeSessionsCache
securityManager.sessionManager.sessionDAO = $sessionDAO

# Configure The EhCacheManager:
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
cacheManager.cacheManagerConfigFile = classpath:ehcache.xml

# Configure the above CacheManager on Shiro's SecurityManager
# to use it for all of Shiro's caching needs:
securityManager.cacheManager = $cacheManager
```
]]#

And remember, **ORDER MATTERS**. By configuring the `cacheManager` on the `securityManager` last, we ensure that the CacheManager can be propagated to all previously-configured `CacheManagerAware` components (such as the `EnterpriseCachingSessionDAO`).

<a name="SessionManagement-Zookeeper"></a>
#[[###Zookeeper]]#

Users have reported using [Apache Zookeeper](http://zookeeper.apache.org/) for managing/coordinating distributed sessions as well. If you have any documentation/comments about how this would work, please post them to the Shiro [Mailing Lists](mailing-lists.html "Mailing Lists")

<a name="SessionManagement-SessionsandSubjectState"></a>
#[[##Sessions and Subject State]]#

<a name="SessionManagement-StatefulApplications%28Sessionsallowed%29"></a>
#[[###Stateful Applications (Sessions allowed)]]#

By default, Shiro's SecurityManager implementations will use a Subject's Session as a strategy to store the Subject's identity (`PrincipalCollection`) and authentication state (`subject.isAuthenticated()`) for continued reference. This typically occurs after a Subject logs-in or when a Subject's identity is discovered via RememberMe services.

There are a few benefits to this default approach:

*   Any applications that service requests, invocations or messages can associate the session ID with the request/invocation/message payload and that is all that is necessary for Shiro to associate a user with the inbound request. For example, if using the `Subject.Builder`, this is all that is needed to acquire the associated Subject:

    ``` java
    Serializable sessionId = //get from the inbound request or remote method invocation payload Subject requestSubject = new Subject.Builder().sessionId(sessionId).buildSubject();
    ```
    
    This is incredibly convenient for most web applications as well as anyone writing remoting or messaging frameworks. (This is in fact how Shiro's web support associates Subjects with ServletRequests in its own framework code).

*   Any 'RememberMe' identity found on an initial request can be persisted to the session upon first access. This ensures that the Subject's remembered identity can be saved across requests without needing to deserialize and decrypt it on _every_ request. For example, in a web application, there is no need to read an encrypted RememberMe cookie on every request if the identity is already known in the session. This can be a good performance enhancement.

<a name="SessionManagement-StatelessApplications%28Sessionless%29"></a>
###Stateless Applications (Sessionless)

While the above default strategy is fine (and often desirable) for most applications, this would not be desirable in applications that try to be stateless whenever possible. Many stateless architectures mandate that no persistent state can exist between requests, in which case Sessions would not be allowed (a Session by its very nature represents durable state).

But this requirement comes at a convenience cost - Subject state cannot be retained across requests. This means that applications with this requirement must ensure Subject state can be represented in some other way for _every_ request.

This is almost always achieved by authenticating every request/invocation/message handled by the application. For example, most stateless web applications typically support this by enforcing HTTP Basic authentication, allowing the browser to authenticate every request on behalf of an end user. Remoting or Messaging frameworks must ensure that Subject principals and credentials are attached to every Invocation or Message payload, typically performed by framework code.

<a name="SessionManagement-DisablingSubjectStateSessionStorage"></a>
#[[####Disabling Subject State Session Storage]]#

Beginning in Shiro 1.2 and later, applications that wish to disable Shiro's internal implementation strategy of persisting Subject state to sessions may disable this entirely across _all_ Subjects by doing the following:

In `shiro.ini`, configure the following property on the `securityManager`:

**shiro.ini**

``` ini
[main]
...
securityManager.subjectDAO.sessionStorageEvaluator.sessionStorageEnabled = false
...
```

This will prevent Shiro from using a Subject's session to store that Subject's state across requests/invocations/messages _for all Subjects_. Just be sure that you authenticate on every request so Shiro will know who the Subject is for any given request/invocation/message.

#warning('Shiro''s Needs vs. Your Needs', 'This will disable Shiro''s own implementations from using Sessions as a storage strategy. It <strong>DOES NOT</strong> disable Sessions entirely. A session will still be created if any of your own code explicitly calls <code>subject.getSession()</code> or <code>subject.getSession(true)</code>.')

<a name="SessionManagement-AHybridApproach"></a>
#[[###A Hybrid Approach]]#

The above `shiro.ini` configuration line (`securityManager.subjectDAO.sessionStorageEvaluator.sessionStorageEnabled = false`) will disable Shiro from using the Session as an implementation strategy for _all_ Subjects.

But what if you wanted a hybrid approach? What if some Subjects should have sessions and others should not? This hybrid approach can be beneficial for many applications. For example:

*   Maybe human Subjects (e.g. web browser users) should be able to use Sessions for the benefits provided above.
*   Maybe non-human Subjects (e.g. API clients or 3rd-party applications) should _not_ create sessions since their interaction with the software may be intermittent and/or erratic.
*   Maybe all Subjects of a certain type or those accessing the system from a certain location should have state persisted in sessions, but all others should not.

If you need this hybrid approach, you can implement a `SessionStorageEvaluator`.

<a name="SessionManagement-SessionStorageEvaluator"></a>
#[[####SessionStorageEvaluator]]#

In cases where you want to control exactly which Subjects may have their state persisted in their Session or not, you can implement the `org.apache.shiro.mgt.SessionStorageEvaluator` interface and tell Shiro exactly which Subjects should support session storage.

This interface has a single method:

**SessionStorageEvaluator**

``` java
public interface SessionStorageEvaluator {

    public boolean isSessionStorageEnabled(Subject subject);

}
```

For a more detailed API explanation, please see the [SessionStorageEvaluator JavaDoc](static/current/apidocs/org/apache/shiro/mgt/SessionStorageEvaluator.html).

You can implement this interface and inspect the Subject for any information that you might need to make this decision.

<a name="SessionManagement-SubjectInspection"></a>
#[[#####Subject Inspection]]#

When implementing the `isSessionStorageEnabled(subject)` interface method, you can always look at the `Subject` and get access to whatever you need to make your decision. Of course all of the expected Subject methods are available to use (`getPrincipals()`, etc), but environment-specific `Subject` instances are valuable as well.

For example, in web applications, if that decision must be made based on data in the current `ServletRequest`, you can get the request or the response because the runtime `Subject` instance is actually a [`WebSubject`](static/current/apidocs/org/apache/shiro/web/subject/WebSubject.html) instance:

``` java
...
    public boolean isSessionStorageEnabled(Subject subject) {
        boolean enabled = false;
        if (WebUtils.isWeb(Subject)) {
            HttpServletRequest request = WebUtils.getHttpRequest(subject);
            //set 'enabled' based on the current request.
        } else {
            //not a web request - maybe a RMI or daemon invocation?
            //set 'enabled' another way...
        }

        return enabled;
    }
```

**N.B.** Framework developers should keep this type of access in mind and ensure that any request/invocation/message context objects are available via environment-specific `Subject` implementations. Contact the Shiro user mailing list if you'd like some help setting this up for your framework/environment.

<a name="SessionManagement-Configuration"></a>
#[[####Configuration]]#

After you've implemented the `SessionStorageEvaluator` interface, you can configure it in `shiro.ini`:

**shiro.ini SessionStorageEvaluator configuration**

``` ini
[main]
...
sessionStorageEvaluator = com.mycompany.shiro.subject.mgt.MySessionStorageEvaluator
securityManager.subjectDAO.sessionStorageEvaluator = $sessionStorageEvaluator

...
```

<a name="SessionManagement-WebApplications"></a>
#[[###Web Applications]]#

Often web applications wish to simply enable or disable session creation on a per request basis, regardless of which Subject is executing a request. This is often used to good effect in supporting REST and Messaging/RMI architectures. For example, perhaps normal end-users (humans using a browser) are allowed to create and use sessions, but remote API clients use REST or SOAP and shouldn't have sessions at all (because they authenticate on every request, as is common in REST/SOAP architectures).

To support this hybrid/per-request capability, a `noSessionCreation` filter has been added to Shiro's 'pool' of default filters enabled for web applications. This filter will prevent new sessions from being created during a request to guarantee a stateless experience. In `shiro.ini` `[urls]` section, you typically define this filter in front of all others to ensure a session will never be used.

For example:

**shiro.ini - Disable Session Creation per request**

``` ini
[urls]
...
/rest/** = noSessionCreation, authcBasic, ...
```

This filter allows session usage for any _existing_ session, but will not allow new sessions to be created during the filtered request. That is, any of the four following method calls on a request or subject _that do not already have an existing session_ will automatically trigger a `DisabledSessionException`:

*   `httpServletRequest.getSession()`
*   `httpServletRequest.getSession(true)`
*   `subject.getSession()`
*   `subject.getSession(true)`

If a `Subject` already has a session prior to visiting the noSessionCreation-protected-URL, the above 4 calls will still work as expected.

Finally, the following calls will always be allowed in all cases:

*   `httpServletRequest.getSession(false)`
*   `subject.getSession(false)`
<input type="hidden" id="ghEditPage" value="session-management.md.vtl"></input>
