---
title:  HTTP Session Management Modules
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

The <%=vars.product_name_long%> HTTP Session Management modules provide fast, scalable, and reliable session replication for HTTP servers without requiring application changes.

<%=vars.product_name_long%> offers HTTP session management modules for tc Server, Tomcat, and AppServers.

These modules are included with the <%=vars.product_name_long%> product distribution, and installation .zip files can be found in the `tools/Modules` directory of your product installation.

-   **[HTTP Session Management Quick Start](../../tools_modules/http_session_mgmt/quick_start.html)**

    In this section you download, install, and set up the HTTP Session Management modules.

-   **[Advantages of Using <%=vars.product_name%> for Session Management](../../tools_modules/http_session_mgmt/http_why_use_gemfire.html)**

    The HTTP Session Management Module enables you to customize how you manage your session data.

-   **[Common Topologies for HTTP Session Management](../../tools_modules/http_session_mgmt/common_gemfire_topologies.html)**

    Decide which topology is best for your usage. The module configuration process is slightly different for each topology.

-   **[General Information on HTTP Session Management](../../tools_modules/http_session_mgmt/tc_additional_info.html)**

    This section provides information on sticky load balancers, session expiration, additional <%=vars.product_name%> property changes, serialization and more.

-   **[Session State Log Files](../../tools_modules/http_session_mgmt/session_state_log_files.html)**

    Several log files are written by the various parts of the session management code.

-   **[Configuring Non-Sticky Sessions](../../tools_modules/http_session_mgmt/configuring_non_sticky_sessions.html)**

    This section describes the configuration of non-sticky sessions.

-   **[HTTP Session Management Module for Pivotal tc Server](../../tools_modules/http_session_mgmt/session_mgmt_tcserver.html)**

    This section describes how to set up and use the HTTP session management module with tc Server templates.

-   **[HTTP Session Management Module for Tomcat](../../tools_modules/http_session_mgmt/session_mgmt_tomcat.html)**

    You set up and use the module by modifying the Tomcat's `server.xml` and `context.xml` files.

-   **[HTTP Session Management Module for AppServers](../../tools_modules/http_session_mgmt/session_mgmt_weblogic.html)**

    You implement session caching with the HTTP Session Management Module for AppServers with a special filter, defined in the `web.xml`, which is configured to intercept and wrap all requests.


