在Spring中实现分布式 session管理
本文主要是在Spring中实现分布式session,采用redis对session进行持久化管理,这样当应用部署的时候,不需要在Resin、Tomcat等容器里面进行分布式配置,方便加入新的节点服务器进行集群扩容,session不依赖各节点的服务器,可直接从redis获取。下面是功能的核心代码:
一、首先在web.xml里面配置
加入拦截器:
<!-- 分布式session start -->
<filter>
<filter-name>distributedSessionFilter</filter-name>
<filter-class>DistributedSessionFilter</filter-class>
<init-param>
<!-- 必填,密钥.2种方式,1对应为bean,格式为bean:key。2字符串,格式如:afffrfgv-->
<param-name>key</param-name>
<param-value>xxxxxxxx</param-value>
</init-param>
<init-param>
<!-- 必填,redis对应的bean,格式为bean:xx-->
<param-name>cacheBean</param-name>
<param-value>bean:redisPersistent</param-value>//DistributedBaseInterFace,对应于此接口,进行session的持久化操作
</init-param>
<init-param>
<!-- 必填, -->
<param-name>cookieName</param-name>
<param-value>TESTSESSIONID</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>distributedSessionFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- 分布式session end -->
二、拦截器的实现,核心代码如下
主要有以下的几个类:
DistributedSessionFilter,
DistributedSessionManager,
DistributedHttpSessionWrapper,
DistributedHttpServletRequestWrapper
1、DistributedSessionFilter实现Filter:
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class DistributedSessionFilter implements Filter {
private static final Logger log = LoggerFactory.getLogger(DistributedSessionFilter.class);
private String cookieName;
//主要是对session进行管理的操作
private DistributedSessionManager distributedSessionManager;
private String key;
}
容器启动时候的初始化方法:
@Override
public void init(FilterConfig config) throws ServletException {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(config
.getServletContext());
String key = config.getInitParameter("key");
String cookieName = config.getInitParameter("cookieName");
String cacheBean = config.getInitParameter("cacheBean");
// 获取bean的名称,配置是"bean:"
String redisBeanStr = cacheBean.substring(5);
DistributedBaseInterFace distributedCache = (DistributedBaseInterFace) wac.getBean(redisBeanStr);
// 获取key,有2种配置方式,1对应为bean,格式为bean:key。2字符串
if (key.startsWith("bean:")) {
this.key = (Strin