當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Session实战3
生活随笔
收集整理的這篇文章主要介紹了
Spring Session实战3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們先把nginx的節點只配置一個tomcat,首先來到我們的命令行,修改我們的happymall.com.conf
現在負載均衡兩個節點,我們把第二個節點先注釋上
然后reload一下./nginx -s reload
我們把sesion的有效期改小一些,改成300秒,也就是5分鐘
<?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="300" /></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>
因為現在nginx只有tomcat1,所以只會負載到這臺機器上,那一會我們做完,把兩個tomcat都啟動起來,現在已經存上這幾個節點
我們看一下時間呢是285,因為我們設置session的有效期時間呢,是300秒,所以現在已經到285了,我們再點擊左側的key,我們可以看到這個TTL的時間在減少
然后我們看一下這個時間,是遠遠大于expire的有效期,他們兩個有效期是一樣的
打開monitor,我們來觀察一下,等他到時間的時候是什么樣的,其實Spring session這么做也是為了保守一些,他的session信息存在這里,但是我是通過expire節點,控制是否刪除真正的session信息,而expires節點呢只負責session的有效期,用這個節點來控制,我們先回到命令行等一下,現在看到的日志并不是自動刪除session,PING其實是檢查心跳,OK的話會返回一個poll,這個時候我們可以看到,已經發生DEL命令
無法加載這個值,是因為他在database里邊,已經不存在了,請重新加載連接數,然后呢重試一下,這個時候我們可以看到,session信息還在這里邊,但是真正使其生效的key已經刪除掉了,所以這個session信息并不會生效,他到時間的時候呢就會自動消失了,那最簡單的辦法,我們為了測試呢,我們把TTL調大一點
那這個時候我們的session信息還要過10萬秒才會消失,那我們嘗試去登陸看一下,在session中是否能夠獲取用戶的信息呢,我們就可以確定,值是否是Spring session在用的,我們回到代碼里邊,來到Spring session controller,Spring session在存儲的時候,存3個key,也就是這幾個key
第一個key和第二個key都已經刪除了,只有第三個key還在,然后我們把它的有效期給延長了,這個時候user拿到的是null
在緩存里邊雖然這個值是存在的,但是呢已經無法獲取了,你在看一下命令行,這個key是唯一存在的
?
但是由于其他兩個關聯的key已經消失,所以他并不會起作用,即使我們把他的有效期設置的非常長,也不會發生任何問題,提示超時沒有關系,因為我們在使用nginx的時候,這個是nginx的一個默認超時時間,那可以通過修改nginx的超時時間,解決這個問題,重新登陸我們先看一下檢查,我們看一下他對cookie做了什么,先把現在的cookie先刪除掉,選中之后按delete鍵,那現在登陸成功了,在application里面的cookie,這里面多了一個name 我們reload一下,這個時候Spring session里面存的就是90d1,也就是這個key 他和我們瀏覽器中的cookie,session的value保持一致,那這個時候我們回想一下,我們原生用redis和cookie,還有filter來實現的單點登陸呢,和Spring Session的原理是一樣的,也就是我們的value,它是作為redis里面存儲的,session數據的一個線索,也就是cookie中存的session里面的value,它是redis里面存儲用戶session信息的一個線索,通過這個value值,來進行一個關聯,而我們寫的cookie呢叫mmall_login_token,而這個value我們之前用mmall_login_token的時候,取的是JSESSIONID,那我們不用JSESSIONID也是OK的,我們隨機生成一個UUID,放到這里邊也是可以的,但是要保證他和redis里邊能對應上的,那這里邊就要說一下,那我們在寫cookie的時候,我們還寫了domain,path,maxage,還有呢httponly,這些值怎么辦呢,我們看一下DefaultCookieSerializer源碼private String cookieName = "SESSION";我們可以通過注入的方式修改它,private boolean useHttpOnlyCookie = isServlet3();是否使用了httpOnlyCookie,返回值是一個布爾,看一下是如何判斷的,/*** Returns true if the Servlet 3 APIs are detected.** @return whether the Servlet 3 APIs are detected*/private boolean isServlet3() {try {ServletRequest.class.getMethod("startAsync");return true;}catch (NoSuchMethodException e) {}return false;}這個注釋寫的也非常清楚,如果是使用servlet3的話,他就會從ServletRequest這個類里面去拿這個方法,如果拿到了肯定不會報異常,所以return true,如果沒有找到就會走這里面,NoSuchMethodException,這個異常就會catch上,catch上之后就會return false,我們項目是使用的tomcat7,里面就是servlet3了,所以如果使用tomcat6的話,那對于這個屬性,返回的就是false,tomcat7返回的就是trueprivate String cookiePath;大家都理解private int cookieMaxAge = -1;private String domainName;這些我們在原生實現的時候,都有去寫他里面的值?
總結
以上是生活随笔為你收集整理的Spring Session实战3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Session实战2
- 下一篇: Spring Session实战4