当前位置: 首页 > 工具软件 > Redis-Session > 使用案例 >

spring-session redis方式session共享

况承福
2023-12-01

以前在做这种分布式部署的时候,习惯性的用nginx里面配置上iphash的方式,简单,不用配置什么就可以。但是这种方式有种种问题。于是,抽空研究了session共享。session共享大概有一下几种方式:
1. 客户端cookie加密的方式
2. web server的session复制方式
3. 使用关系数据库保存session
4. 使用nosql数据库保存session
5. 采用Session Stick
6. 使用terracotta来保存session

文章http://blog.csdn.net/mr_smile2014/article/details/50211677,详细说明了他们的优缺点。

通过分析,我选择用nosql的方式进行session共享,网上很多说明共享的方式,我选择利用redis方式进行配置。
1、根pom.xml配置相关包

<!-- redis配置 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.4.2</version>
</dependency>
<dependency>  <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.6.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.2</version>
</dependency>

2、基础pom中引进

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

3、配置ctx-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/aop  
                        http://www.springframework.org/schema/aop/spring-aop.xsd
                        http://www.springframework.org/schema/tx    
                        http://www.springframework.org/schema/tx/spring-tx.xsd"
    default-autowire="byName">

    <bean
        class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />
    <bean
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="port" value="${redis.port}"></property>
        <property name="hostName" value="${redis.ip}"></property>
    </bean> 
</beans>

4、配置ip、port相关文件redis.properties

redis.pool.maxActive=1024
redis.pool.maxIdle=200
redis.pool.maxWait=1000
redis.pool.testOnBorrow=true
#IP
redis.ip=127.0.0.1
#Port
redis.port=6379
redis.timeout=15000

5、引入redis.properties

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="locations">
            <list>
            <value>classpath:jdbc.properties</value>
          <value>classpath:important.properties</value>
            <value>classpath:redis.properties</value>
            </list>
        </property>
    </bean>

6、引入ctx-redis.xml

<import resource="classpath*:ctx-redis.xml" />

7、在web.xml中配置过滤

<!-- redis的session共享 -->
    <filter>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

ok,配置完成了,你可以敬请的使用了。嘿,别高兴的太早了,我使用的时候结果就是报错,原因主要由以下两点引起:

  1. spring版本号错误
  2. redis服务器版本号错误

    确保你的spring使用的是4.1.7.RELEASE及以上,我使用的版本为4.1.7.RELEASE。
    确保你redis服务器为2.8以上的,我使用的为3.0.5版本。
    替换成响应版本后,应该就可以,当然替换spring版本,不是那么容易,很容易报一堆缺包的错误,你需要确认你的maven库里面有对应的包,如果没有自动下载成功,你需要到search.maven.org里面自己找到下载后放到相应目录就行了。

代码上可以跑起来了,下面就进行多个服务器的配置了。我选择两个服务器,端口分别为8080、8090,将相关包放在tomcat中启动这两个tomcat。
在nginx中配置如下:

upstream hdd {
        #weigth参数表示权值,权值越高被分配到的几率越大

        server 127.0.0.1:8080 weight=1;
        server 127.0.0.1:8090 weight=1;
    }


    ###服务器配置
    server {  
        listen       80;  
        server_name  www.hdd.com;  

        location / { 
            proxy_pass http://hdd; 
            proxy_redirect          off;  
            proxy_set_header        Host            $host:$server_port;  
            proxy_set_header        X-Real-IP       $remote_addr;  
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
            client_max_body_size    32m;  
            client_body_buffer_size 128k;  
            proxy_connect_timeout   8;  
            proxy_send_timeout      90;  
            proxy_read_timeout      90;   
        }  
    } 

修改自己的hosts配置文件

127.0.0.1 www.hdd.com

启动redis,nginx,然后通过www.hdd.com访问,你就可以进入自己的主页了。再浏览器中测试,将sessionId打印出来,观察在两个tomcat中的sessionId的值。
也可以观察redis中数据变化,redis中常见命令汇总:
http://www.cnblogs.com/kreo/p/4399612.html


参考资料:

  1. http://emacsist.github.io/2015/07/29/Nginx-Tomcat-Session-%E5%85%B1%E4%BA%AB%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/
  2. http://jingyan.baidu.com/article/c33e3f488a1024ea15cbb5e3.html
  3. http://www.cnblogs.com/kreo/p/4399612.html
 类似资料: