对于分布式系统来说,分布式session是首先要解决的问题,业界目前的解决方式大概可以归纳为三种(转自http://www.cnblogs.com/cxrz/p/8529587.html)
一、Session Replication 方式管理 (即session复制)
简介:将一台机器上的Session数据广播复制到集群中其余机器上
使用场景:机器较少,网络流量较小
优点:实现简单、配置较少、当网络中有机器Down掉时不影响用户访问
缺点:广播式复制到其余机器有一定廷时,带来一定网络开销
二、Session Sticky 方式管理
简介:即粘性Session、当用户访问集群中某台机器后,强制指定后续所有请求均落到此机器上
使用场景:机器数适中、对稳定性要求不是非常苛刻
优点:实现简单、配置方便、没有额外网络开销
缺点:网络中有机器Down掉时、用户Session会丢失、容易造成单点故障
三、缓存集中式管理
简介:将Session存入分布式缓存集群中的某台机器上,当用户访问不同节点时先从缓存中拿Session信息
使用场景:集群中机器数多、网络环境复杂
优点:可靠性好
缺点:实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入
第二种方式可以使用nginx的ip_hash功能来实现,很简单。今天笔者带着大家来实现基于shiro与redis的分布式session管理。
一、首先是搭建ssm、shiro、redis的框架
pom文件依赖如下:
org.springframework
spring-context
5.0.0.RELEASE
org.springframework
spring-core
5.0.0.RELEASE
org.springframework
spring-beans
5.0.0.RELEASE
org.springframework
spring-web
5.0.0.RELEASE
org.springframework
spring-webmvc
5.0.0.RELEASE
org.springframework
spring-aop
5.0.0.RELEASE
org.springframework
spring-tx
5.0.0.RELEASE
org.springframework
spring-jdbc
5.0.0.RELEASE
org.mybatis
mybatis
3.4.5
org.mybatis
mybatis-spring
1.3.1
org.apache.shiro
shiro-core
1.3.2
org.apache.shiro
shiro-spring
1.3.2
mysql
mysql-connector-java
5.1.30
com.alibaba
druid
1.0.14
javax.servlet
jsp-api
2.0
provided
javax.servlet
jstl
1.2
commons-fileupload
commons-fileupload
1.3.2
commons-lang
commons-lang
2.6
junit
junit
4.12
test
org.springframework.data
spring-data-redis
1.6.1.RELEASE
redis.clients
jedis
2.7.3
org.slf4j
slf4j-api
1.7.21
org.slf4j
slf4j-log4j12
1.7.21
com.alibaba
fastjson
1.1.26
commons-beanutils
commons-beanutils
1.8.0
com.fasterxml.jackson.core
jackson-databind
2.9.4
com.fasterxml.jackson.core
jackson-annotations
2.9.4
com.fasterxml.jackson.core
jackson-core
2.9.4
spring的配置文件:
spring-core.xml:
spring-mybatis.xml
spring-redis.xml
spring-mvc.xml
配置文件:
jdbc.jdbcDriver=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/XXXXXX
jdbc.jdbcUsername=root
jdbc.jdbcPassword=root
jdbc.initialSize=10
jdbc.minIdle=6
jdbc.maxActive=50
jdbc.maxWait=60000
jdbc.timeBetweenEvictionRunsMillis=60000
redis.maxIdle=300
redis.minIdle=100
redis.maxWaitMillis=3000
redis.testOnBorrow=true
redis.maxTotal=500
redis.host=127.0.0.1
redis.port=6379
redis.password=123abc
log4j.rootLogger=INFO,Console,File
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
log4j.appender.File = org.apache.log4j.RollingFileAppender
log4j.appender.File.File = logs/ssm.log
log4j.appender.File.MaxFileSize = 10MB
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
web.xml
contextConfigLocation
classpath:spring-core.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
SpringMVC
/
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
targetFilterLifecycle
true
shiroFilter
/*
REQUEST
FORWARD
INCLUDE
ERROR
/WEB-INF/index.jsp
(二)——shiro集成 https://blog.csdn.net/money9sun/article/details/86604900