當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Session实战2
生活随笔
收集整理的這篇文章主要介紹了
Spring Session实战2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RedisHttpSessionConfiguration,就是這么一個類,那這個類里面很明顯的可以看到,默認session有效期的時間是1800秒,也就是30分鐘private Integer maxInactiveIntervalInSeconds = 1800;可以改成其他值,通過注入的方式,那這個bean的id呢就用駝峰的方式,這里的bean一定要注入,才會加載到我們的spring容器當中,即使我們不修改我們的默認session有效期,這個值我們可以改也可以不改,因為value是1800秒,但是強調的是這個bean一定要聲明,我們來看一下JedisConnectionFactory這個類的源碼,他實現了很多接口,最重要的是RedisConnectionFactory,有很多他的實現類,包括Lettuce,那我們用的就是JedisConnectionFactory,然后看一下這個類的屬性,例如hostName是localhostprivate String hostName = "localhost";也就是hostName默認的是本機,包括默認的一個超時時間private int timeout = Protocol.DEFAULT_TIMEOUT;這里邊是2000毫秒,也就是2秒,還有默認的端口,這個是哨兵的一個端口,默認的端口是6379,哨兵是什么呢,就是這個位置,public static final String DEFAULT_HOST = "localhost";public static final int DEFAULT_PORT = 6379;public static final int DEFAULT_SENTINEL_PORT = 26379;public static final int DEFAULT_TIMEOUT = 2000;private RedisSentinelConfiguration sentinelConfig;這個位置是哨兵的一個配置,哨兵就是他來監聽,如果你這個節點掛了,會自動按照你配置好的策略,進行轉移,這樣可以提高Redis分布式集群的一個可用性,然后是密碼,是否使用連接池,各種配置,然后我們要關注一下JedisShardInfo,之前我們寫過一個分布式的,我們看一下這個類,它里面就是jedis這個包里面的,我們打開這個類,這個類是RedisShardedPool,這個是我們寫的分片的連接池的類,private static void initPool(){JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(maxTotal);config.setMaxIdle(maxIdle);config.setMinIdle(minIdle);config.setTestOnBorrow(testOnBorrow);config.setTestOnReturn(testOnReturn);config.setBlockWhenExhausted(true);//連接耗盡的時候,是否阻塞,false會拋出異常,true阻塞直到超時。默認為true。JedisShardInfo info1 = new JedisShardInfo(redis1Ip,redis1Port,1000*2);JedisShardInfo info2 = new JedisShardInfo(redis2Ip,redis2Port,1000*2);List<JedisShardInfo> jedisShardInfoList = new ArrayList<JedisShardInfo>(2);jedisShardInfoList.add(info1);jedisShardInfoList.add(info2);pool = new ShardedJedisPool(config,jedisShardInfoList, Hashing.MURMUR_HASH, Sharded.DEFAULT_KEY_TAG_PATTERN);}然后看一下JedisShardInfo,大家可以看到我們在初始化的時候,其實用的是一個jedisShardInfoList,這里面有兩個值,info1和info2這兩個節點,那我們再回來,看一下Spring提供的,說明我們這個版本分片的是不支持的,也許以后的版本會支持,當然我也看了1.3.1也是沒有支持的,但是這不重要,主要講的是我們來分析源碼的,然后把Spring Session接入進來,所以我們要注入的是JedisPoolConfig,還有注入這些屬性,端口,超時時間,JedisPoolConfig也是用的Jedis包里的,我們接著回來寫Jedis配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"><property name="maxInactiveIntervalInSeconds" value="1800" /></bean><bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer"><property name="domainName" value=".happymmall.com" /><property name="useHttpOnlyCookie" value="true" /><property name="cookiePath" value="/" /><property name="cookieMaxAge" value="31536000" /></bean><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxTotal" value="20"/></bean><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="127.0.0.1" /><property name="port" value="6379" /><property name="poolConfig" ref="jedisPoolConfig" /></bean></beans>
Error creating bean with name,創建filter的時候,出現了一個異常
那這個filter是什么呢,打開這個類,Spring4.0.0里面使用了一個繼承,這里有一個小bug,當然他在4.0.3里面已經修復了這個問題,我們只要把我們的Spring改成4.0.3<spring.version>4.3.0.RELEASE</spring.version>那現在要介紹一個命令,就是redis client里面的命令,這里面有很多key,我們把6379的redis flush一下,那所有的key就清空了,然后我們monitor一下,monitor是看redis的,現在我們已經monitor了flushdbkey *monitor
在我們學習排查問題的時候,用的也非常非常多,那可以看到這里已經有連接過來,其實monitor就是監聽的一個日志,現在我們monitor已經啟動了,我們放到這里邊,缺點也比較明顯,Spring Session不支持分片的list,現在我們的這個Session是Spring Session包裝過的,里面的session看一下,類型是RedisOperationSessionRepository下面的RedisSession,這個RedisOperation,我們之前在文檔里面看過一次,RedisOperationSessionRepository,這里面講的就是這個類,我們一點點來,首先來個宏觀認識,一會我們再進這個類里面來看,這里有一個異常,這個異常非常簡單,不能夠序列化
那個類呢,user這個類,其實里面使用的是Springwork里面的JDK,這里面報了一個異常,所以導致我們的redis,存儲session的時候出現了異常,那我們怎么做呢,走到我們這個user類里面,我們實現一個接口,還記得我們servetResponse這個類里面,我們就實現了Serializable這么一個接口,它是可串行化的,可序列化的,那我們User也要實現這個接口,這樣就OK了,同樣上面GET/SET方法,我們只用user實現一下這個接口
package com.learn.pojo;import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;
import java.util.Date;
import java.util.List;@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {private Integer id;private String username;private String password;private String email;private String phone;private String question;private String answer;private Integer role;private Date createTime;private Date updateTime;}
我們先把monitor打開,它會執行setAttribute,我們看一下monitor監聽到的日志,剛剛我們user實現序列化接口,所以就沒有異常了,也就都正常了,首先執行了HMSET,然后ADD,PEXPIRE是以毫秒數
publish是一個發布訂閱,是為了后邊Spring Session,來刪除存儲在redis里面用戶session信息,然后執行了一個getall,那hmset里面,可以看一下,這個就是sessionId,然后attribute的key是currentUser,這個很明顯他就是一個email,這里面x開頭的都是漢字,當我們反序列化就能夠拿到他了,可以看到,這個用戶登陸完之后,生成了三個值,我們看最大的session,可以看到,這么一個hash結構,最后一次進入的時間,sessionAtrr,是currentUser,當前用戶的一個信息,這里面我們把它改成JSON,可以看到,有一些漢字就可以看到了
亂碼不用關心,因為里邊用了序列化的方式,還存儲了一個JAVA的類型,它是一個String類型的,包括number類型,那我們session里面的信息,我們還是把顯示復原,然后這個是創建的時間,這個很簡單,就是session的時間,這個很明顯,在expire里邊,他的TTL是1608,我們reload一下,看到了他變成了1589
我們這個key的目的,就是使我們這個session過期,因為我們在Spring里面,注入的是1800毫秒,等時間到了,這個會自然地刪除,一會我們把session的有效期調一點,然后領著大家來看一下,他刪除的一個過程
?
總結
以上是生活随笔為你收集整理的Spring Session实战2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Session实战
- 下一篇: Spring Session实战3