`
tangkuo
  • 浏览: 100263 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

session共享多节点部署之redis

阅读更多
第一步:导入相关依赖jar包在pom.xml文件;
<!-- redis依赖 start -->
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- spring session的依赖 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
        <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<!-- redis依赖 end -->

第二步:配置文件配置连接redis相关配置项;
#redis的ip地址 
spring.redis.host=10.4.4.11
#密码 
spring.redis.password=sdj
#端口号 
spring.redis.port=6379
#spring.redis.database=0
#spring.session.store-type=redis

#开启cookie安全
server.servlet.session.cookie.secure=false


#客户端超时时间单位是毫秒 默认是2000
redis.timeout=100000 

#最大空闲数 
redis.maxIdle=5
#最小空闲数
redis.minIdle=2 
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal 
redis.maxTotal=20
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 
redis.maxWaitMillis=1000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 
redis.testOnBorrow=true 

第三步:编写连接redis工具类 RedisConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.pay.common.util.RedisUtil;
import com.pay.common.util.UtilJedis;

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
* redis配置类
*
* @author
*
*/
@Configuration
public class RedisConfig {

@Value("${redis.maxIdle}")
private Integer maxIdle;

@Value("${redis.minIdle}")
private Integer minIdle;

@Value("${redis.maxTotal}")
private Integer maxTotal;

@Value("${redis.maxWaitMillis}")
private Integer maxWaitMillis;

@Value("${redis.testOnBorrow}")
private boolean testOnBorrow;

@Value("${spring.redis.host}")
private String hostName;

@Value("${spring.redis.port}")
private Integer port;

@Value("${spring.redis.password}")
private String password;

@Value("${redis.timeout}")
private Integer timeout;

/**
* JedisPoolConfig 连接池
*
* @return
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大空闲数
jedisPoolConfig.setMaxIdle(maxIdle);
// 连接池的最大数据库连接数
jedisPoolConfig.setMaxTotal(maxTotal);
jedisPoolConfig.setMinIdle(minIdle);
// 最大建立连接等待时间
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
jedisPoolConfig.setTestOnBorrow(testOnBorrow);

return jedisPoolConfig;
}

@Bean
public JedisPool redisPoolFactory() {
JedisPool jedisPool = new JedisPool(jedisPoolConfig(), hostName, port, timeout, password, 0, "partner:1");
return jedisPool;
}

@Bean(name = "redisUtil")
public RedisUtil redisUtil() {
RedisUtil redisUtil = new RedisUtil();
redisUtil.setJedisPool(redisPoolFactory());
redisUtil.setUtilJedis(getUtilJedis());
return redisUtil;
}

@Bean(name = "utilJedis")
public UtilJedis getUtilJedis() {
return new UtilJedis();
}
}

获取图形验证码接口需要将sessionId对应的图形验证码值存入redis;
String jsessionid = session.getId();
  // 验证码保存到redis;
  redisUtil.setValAndExpire(Constants.REDIS_INVESTOR_CODE_PREFIX + jsessionid, Constants.CODE_TIMEOUT, verifyCode);


第四步: 拦截器处理 LoginInterceptor;
public class LoginInterceptor extends HandlerInterceptorAdapter {

@Autowired
private RedisUtil redisUtil;

//public static String timeOutTemp;
/**
* session超时时间
*/
@Value("${cookie.timeout}")
protected String timeout;
@Autowired
private Environment env;


HttpSession session = request.getSession();
Object username = session.getAttribute(Constants.LOGIN_USER_NAME);
// 分布式环境部署sessionId读取redis存储登录对象信息;
String jsessionid = request.getSession().getId();
// 读取缓存redis登陆态信息
String loginUserInfo = (String) redisUtil.getObject(Constants.SESSION_AUTH + jsessionid);
LoginUserInfo lu = null;
if (StringUtils.isNotBlank(loginUserInfo) && null != JSONValidator.from(loginUserInfo)
&& JSONValidator.from(loginUserInfo).validate()) {
lu = JSON.parseObject(loginUserInfo, LoginUserInfo.class);
}



/**
* 判断同一个登录账号是否在多个浏览器客户端登录成功;
*
* @Title: checkSessionId
* @Description: (校验sessionId是否过期失效)
* @param loginId   String
* @param sessionId String
* @return boolean 返回类型
*/
private boolean checkSessionId(String loginId, String sessionId, HttpServletRequest request) {
boolean flag = true;
// 根据登录查询用户信息,判断userName与sessionId存储在redis中的登录账号名称是否一致;
String jsessionid = request.getSession().getId();
String loginUserInfo = (String) redisUtil.getObject(Constants.SESSION_AUTH + jsessionid);
LoginUserInfo auth = JSON.parseObject(loginUserInfo, LoginUserInfo.class);
if(null == auth) {
return false;
}
//登录账号多端登录,自动踢出系统;
String userName = auth.getLoginName();
String storeRedisJsessionid = redisUtil.getKeyValue(Constants.REDIS_LOGIN_PREFIX + userName);

//     LogUtil.MSG.info("checkSessionId is start 请求报文:sessionId=" + sessionId+"userName="+LogUtil.getName(loginId));
//   LogUtil.MSG.info("checkSessionId is end 响应报文:" + LogUtil.printReqMsg(userInfo));
if (null != auth && jsessionid.equals(storeRedisJsessionid)) {
// 同一客户端登录(当前登录账号对应的sessionId值与数据库存储的Jsessionid一致)
} else {
// 更新数据库sessionId
flag = false;
}
return flag;
}

第五步: 登录接口处理LoginController;
@RequestMapping(value = "/login.action", method = RequestMethod.POST)
@ResponseBody
public String login(HttpServletRequest request, String randomCode) {
LogUtil.MSG.info("【用户输入验证码】 randomCode:【{}】", randomCode);
Map<String, String> map = new HashMap<String, String>();
try {
String sessionId = request.getSession().getId();
LogUtil.MSG.debug("sessionId:{}", sessionId);
//String verifyCode = (String) request.getSession().getAttribute(Constants.SESSION_RANDOMCODE);
String verifyCode = redisUtil.getKeyValue(Constants.REDIS_INVESTOR_CODE_PREFIX + sessionId);
Boolean isResponseCorrect = checkVerifyCode(randomCode, verifyCode);
if (isResponseCorrect) {
request.getSession().removeAttribute(Constants.SESSION_RANDOMCODE);


request.getSession().setAttribute(Constants.LOGIN_USER_INFO, lu);
request.getSession().setAttribute(Constants.LOGIN_USER_NAME, userName);
request.getSession().setAttribute(Constants.OPERATE_DATE, String.valueOf(new Date().getTime()));
        request.getSession().setAttribute(Constants.LOGIN_USER_ID, String.valueOf(lu.getOperatorId()));

//登录成功将用户对象存入redis;
//String redisKey = userName;
String jsessionid = sessionId;
redisUtil.setValAndExpire(Constants.REDIS_LOGIN_PREFIX + userName, Constants.REDIS_TIMEOUT, jsessionid);
// 登录信息放入redis
redisUtil.setExObject(Constants.SESSION_AUTH + jsessionid, Constants.REDIS_TIMEOUT, JSONObject.toJSONString(lu));




第六步退出登录接口处理 logout;
@RequestMapping(value = "/logout.action")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession();
//退出登录从redis中删除;
String jsessionid = session.getId();
// 读取缓存redis登陆态信息
redisUtil.del(Constants.SESSION_AUTH + jsessionid);
String userName = (String) session.getAttribute("userName");
if (userName != null) {
session.removeAttribute("userName");
}
String redirectUrl = "/";
String profile = env.getProperty("spring.cloud.config.profile");
if(!"dev".equals(profile)) {
String contenxtPath = request.getContextPath();
contenxtPath = "/".equals(contenxtPath) || "".equals(contenxtPath) ? contenxtPath + "/" + EnvProperties.getDomain() : contenxtPath;
redirectUrl = contenxtPath;
}
return "redirect:" + redirectUrl;
}


分享到:
评论

相关推荐

    Spring Session + redis实现session共享

    在现代Web应用开发中,session共享是一个至关重要的需求,特别是在分布式系统中,多个服务器节点需要共享用户的状态信息。Spring Session + Redis的结合提供了一个高效且可靠的解决方案,它允许跨服务器节点透明地...

    redis linux(集群&单机) + Tomcat Session共享

    本资料包提供了从单机到集群的Redis部署教程,以及与Tomcat应用服务器Session共享的解决方案。 1. **Redis单机安装**:在Linux环境下,Redis的安装通常通过编译源码或者使用包管理器如`apt`或`yum`进行。单机安装...

    tomcat-redis-session-manager

    `tomcat-redis-session-manager`就是这样一款解决方案,它将Tomcat的session管理与Redis相结合,实现了跨服务器的session共享。 首先,让我们理解`tomcat-redis-session-manager`的核心概念。这是一个开源项目,它...

    redis集群session共享jar包之tomcat7

    Redis 集群在Web应用中的使用,特别是与Tomcat7结合实现Session共享,是现代分布式系统中解决Session一致性问题的常见方案。本篇将详细探讨如何利用Redis集群来存储和共享Tomcat7应用程序的Session数据,以提高系统...

    redis+tomcat集群配置session共享

    在分布式系统中,Session共享是一个重要的议题,尤其是在使用Redis与Tomcat构建的集群环境中。当用户在集群中的任一节点登录后,其Session信息需要在其他节点也能访问,以实现会话持久化,保证用户体验的一致性。本...

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    这通常涉及到服务器集群的部署,其中Session共享是一个核心问题。本篇文章将探讨如何利用Redis、Tomcat和Nginx来实现Session共享,以便在分布式环境中保持用户状态的一致性。 首先,让我们了解一下Session的概念。...

    tomcat8 Redis Session共享

    标题中的“Tomcat8 Redis Session共享”指的是在Tomcat8应用程序服务器中,使用Redis作为Session存储,实现跨应用、跨服务器的Session共享。这通常在分布式系统中非常有用,因为默认情况下,Tomcat的Session是基于...

    SpringSession+Redis实现Session共享案例

    SpringSession结合Redis实现Session共享是Web开发中一种常见的解决方案,特别是在分布式系统中,为了保持用户在不同服务器之间访问时的会话一致性。本案例旨在教你如何配置和使用SpringSession与Redis来达到这一目的...

    tomcat7+jdk1.7+redis session共享;tomcat8+jdk1.8+redis session共享 jar包+配置文件

    在构建分布式系统时,session共享是一个关键问题,特别是在使用多个应用服务器(如Tomcat)的集群环境中。这里的主题是利用Redis作为中间缓存来实现Tomcat集群中的session共享,这可以确保用户在集群中的任意一台...

    nginx+spring-session+redis 实现session共享

    在分布式环境中,由于用户请求可能被路由到不同的服务器节点,传统的session存储方式(如JVM内存)无法满足需求,因此需要借助外部存储来实现session共享。 首先,`Nginx` 是一个高性能的反向代理服务器,常用于...

    tomcat8.5.38 redis session 共享所需jar

    在构建高可用的Web应用程序时,常常需要处理session共享的问题,特别是在使用Tomcat作为应用服务器并部署成集群的情况下。本文将详细讲解如何在Tomcat 8.5.38版本中实现基于Redis的session共享,以及所需的jar文件和...

    tomcat7 集群通过redis共享session 所需jar包

    6. **安全和性能考虑**:虽然Redis提供了Session共享的便利,但需要注意安全性,避免敏感信息泄露。同时,过多的Session存储在Redis可能导致内存压力,应适当调整Session的生命周期和Redis的内存配置。 综上所述,...

    tomcat8+redis+session共享jar包

    标题中的“tomcat8+redis+session共享jar包”指的是在Tomcat 8这个流行的Java应用服务器上,通过集成Redis缓存系统实现session共享的一种解决方案。Session共享在分布式环境中尤为重要,因为用户在不同服务器间的...

    redis 集群共享Session

    由于其内存存储和高效的性能,Redis常被用于缓存、消息代理以及像Session共享这样的场景。 2. **Session的基本概念** Session是Web服务器用来跟踪用户状态的一种技术。当用户登录后,服务器会创建一个Session对象...

    springboot+Nginx+redis实现session共享

    1. 部署Redis服务器,确保其正常运行。 2. 创建Spring Boot应用,配置RedisSessionRepository并实现Session管理。 3. 配置Nginx,设置负载均衡策略为`ip_hash`。 4. 在应用启动时,通过Spring Boot的`@ CommandLine...

    tomcat-redis-session-manager tomcat+nginx+redis集群所需jar

    5. **集群部署**: 在集群环境下,多个Tomcat实例和Redis节点协同工作,提供服务。通过Nginx的负载均衡配置,可以有效地在这些实例间分配负载,同时Redis的集群模式可以保证数据的一致性和高可用性。 6. **Java JAR...

    Tomcat7集群共享Session 基于redis进行统一管理

    在IT行业中,尤其是在Web...总的来说,利用Redis进行Tomcat集群Session共享是一种高效且灵活的方法,能够提高系统的可用性和用户体验。通过深入理解这一技术,开发者可以更好地构建和维护大规模分布式Web应用程序。

    tomcat-redis-session共享资源包

    《Tomcat与Redis实现Session共享详解》 在Web开发中,Session是服务器用来跟踪用户状态的重要工具,然而,随着分布式系统的普及,单个应用往往被拆分成多个服务,每个服务独立运行,这时传统的Session管理方式就...

    tomcat集群session共享

    以下是实现Tomcat集群session共享与Redis结合的步骤和知识点: 1. **配置Redis服务器**:首先,你需要安装并运行一个Redis实例。确保其稳定运行,并且能够被集群中的所有Tomcat服务器访问。 2. **选择session复制...

Global site tag (gtag.js) - Google Analytics