Spring Boot 解決方案 會話

2021-09-19 20:19:45 字數 2660 閱讀 4254

spring boot 解決方案 - 會話

連線無狀態

使用 http 的連線是無狀態的,因此為了應對需要狀態的服務例如使用者登入,誕生了適合儲存狀態的設計-會話(session),本文就來**一下會話。

會話的使用

spring mvc 中使用會話很簡單,在控制器類的方法引數列表中,直接編寫 httpsession 型別的引數,或者引數列表中編寫 httpservletrequest 類,然後使用 getsession() 方法獲取會話。

下面是使用會話的簡單例子,第一次訪問時會建立乙個無資料的會話,因此獲取到的 access 屬性為 null ,而當不是第一次訪問時,由於屬性不為 null 會得到 "not the first time access" 。

@restcontroller

public class democontroller

return "not the first time access";

}}注意:由於用 mock mvc 測試獲取不到第一次請求 cookies,因此無法模擬得到正確結果,請使用瀏覽器或者請求工具測試。

常用方法

上面例子展示了會話的簡單使用,其中 httpsession 介面是 servlet 的標準,而 spring mvc 中的會話預設使用 tomcat 的實現。下面來介紹幾個常用方法,更多方法使用請參考這篇文章。

object getattribute(string) 方法用來獲取會話的屬性,若不存在則返回 null

void setattribute(string, object) 方法用來設定會話的屬性

void removeattribute(string) 方法用來刪除會話的屬性

void setmaxinactiveinterval(int) 方法用來設定會話失效時間,單位為秒,設定小於等於零的數則會話永不過期

void invalidate() 手動使會話失效並清理會話資料

會話***

會話的生命週期分別為建立、失效和建立與失效之間,而會話***是為了滿足會話生命週期中觸發相應事件的需要,httpsessionlistener 和 httpsessionbindinglistener 兩個***介面分別滿足了會話的各個生命週期。使用***只需實現這些介面然後標註 @weblistener 註解即可,下面會有實現的例子。

針對會話的***

httpsessionlistener 介面可以算是針對會話的***介面,因為它的兩個方法分別在會話建立和失效時呼叫,下面為乙個簡單的例子,引數列表中 httpsessionevent 類可以用 getsession 獲取會話。

針對會話屬性的***

與 httpsessionlistener ***介面接管會話生命週期的建立與失效不同,httpsessionbindinglistener ***介面負責會話屬性的建立與銷毀,下面為該***的簡單例子,引數列表中 httpsessionbindingevent 類除了可以用 getsession 獲取會話,最主要的是可用 getname 和 getvalue 分別獲取屬性的名字和值。

使***生效

上面的例子只是編寫了***的實現,為了使得***在專案裡生效,還必須在啟動類或者配置類上標註 @servletcomponentscan 來掃瞄這些屬於 servlet 元件的***,例如下面在配置類上啟動 servlet 元件掃瞄。

// ...
}

分布式會話

若是有多台 web 伺服器提供不同的服務,且要求屬於同一會話,上面的單機會話例子就無法滿足要求,於是就有了分布式會話即可以共享會話資料。

利用 spring session 就可以實現分布式會話,而 spring session 的實現可依賴關聯式資料庫或記憶體資料庫,下面例子為 spring boot 中匯入基於 redis 實現的 spring session 的依賴。

org.springframework.boot

spring-boot-starter-data-redis

org.springframework.session

spring-session-data-redis

redis.clients

jedis

接著在 spring boot 的屬性配置檔案中,新增如下的屬性即可,而對於會話的使用和單機會話操作是一樣的。

spring:

session:

store-type: redis
redis:

host: 127.0.0.1

port: 6379

Spring Boot跨域解決方案

為保證瀏覽器的安全,不同源的客戶端指令碼在沒有明確授權的情況下,不能讀寫對方資源,這稱之為同源策略,如果乙個請求位址裡的協議 網域名稱 埠號都相同,就屬於同源。依據瀏覽器同源策略,非同源指令碼不可操作其他源下的物件,想要操作其他源下的物件就需要跨域。cors是為解決瀏覽器跨域問題由w3c提出的跨源資...

spring boot 錯誤頁面配置解決方案

如果訪問了錯誤的路徑,或者後台報錯 如果沒有乙個統一的頁面!或者說頁面上展示一堆報錯資訊,既影響美觀,又對使用者不友好!那麼如何配置?定義 errorpageconfig,配置錯誤狀態與對應訪問路徑 component public class errorpageconfig implemefgic...

Pervasive產品及解決方案體驗會

pervasive產品及解決方案體驗會 我們的使命 提公升企業資料整合能力,讓整合資料分析和資料共享成為可能 您的公司還在使用儲存過程來進行etl的工作嗎?想必您的技術人員或您自己開始為繁瑣的編碼和可能的人員替換而困擾不已,維護難度越來越大 您的公司無力購買非常昂貴的etl或資料整合工具,而被迫採用...