1. 程式人生 > >spring-session實現分散式session共享及自定義sessionid

spring-session實現分散式session共享及自定義sessionid

public class MyHttpSessionStrategy implements HttpSessionStrategy {

    private final Logger logger = LoggerFactory.getLogger(WlwHttpSessionStrategy.class);

	//這用Qualifier註解,如果你的工程還集成了spring-data-redis,需要指定一下用哪一個
    @Qualifier("sessionRedisTemplate")
    @Autowired
    private RedisTemplate redisTemplate;
//過期時間,與session過期時間保持一致
    private Long maxInactiveIntervalInSeconds = 999L;
    private String xxxRedisName = "spring:session:xxx:";
	//當客戶端沒有傳xxx引數的時候,避免建立多個無用的session佔用redis空間
    private String defaultSessionId = "default-sessionid";

    /**
     * 客戶端傳過來的是xxx,需要通過xxx查詢對映關係,拿到sessionid返回
     */
    public String getRequestedSessionId(HttpServletRequest request) {
        String xxx = request.getParameter("xxx");
        ValueOperations<String, String> vops = redisTemplate.opsForValue();
        if (xxx != null && !xxx.equals("")) {
            String sessionid = vops.get(xxxRedisName + xxx);
            if(sessionid!=null){
                redisTemplate.expire(xxxRedisName + xxx, maxInactiveIntervalInSeconds, TimeUnit.SECONDS);
            }
            return sessionid;
        } else {
            return vops.get(xxxRedisName+defaultSessionId);
        }
    }

    /**
     * 建立session時,儲存xxx和sessionid的對映關係
     */
    public void onNewSession(Session session, HttpServletRequest request,
                             HttpServletResponse response) {
        String xxx = request.getParameter("xxx");
        String sessionid = session.getId();
        ValueOperations<String, String> vops = redisTemplate.opsForValue();
        if (xxx != null && !xxx.equals("")) {
            //儲存xxx和sessionid對映關係
            vops.set(xxxRedisName + xxx, sessionid);
            redisTemplate.expire(xxxRedisName + xxx, maxInactiveIntervalInSeconds, TimeUnit.SECONDS);
        }else{
            //沒有傳xxx時,儲存為預設
            vops.set(xxxRedisName+defaultSessionId, sessionid);
            redisTemplate.expire(xxxRedisName+defaultSessionId, maxInactiveIntervalInSeconds, TimeUnit.SECONDS);
        }
    }

    public void onInvalidateSession(HttpServletRequest request,
                                    HttpServletResponse response) {
        String xxx = request.getParameter("xxx");
        redisTemplate.expire(xxxRedisName + xxx, 0, TimeUnit.SECONDS);
    }

}
好了,完工了。。。

相關推薦

spring-session實現分散式session共享定義sessionid

public class MyHttpSessionStrategy implements HttpSessionStrategy { private final Logger logger = LoggerFactory.getLogger(WlwHttpSessionStrategy.class

Spring Boot學習筆記-錯誤處理定義

正常的Web應用開發時,需要考慮到應用執行發生異常時或出現錯誤時如何來被處理,例如捕獲必要的異常資訊,記錄日誌方便日後排錯,友好的使用者響應輸出等等。 當然應用發生錯誤,有可能是應用自身的問題,也有可能是客戶端操作的問題。 Spring Boot預設提供了一種錯誤處理機制。 預設錯誤處理機制 預設情況下,S

spring-security認證過程的分析定義登入

首先spring-security配置認證過濾器,它是spring-security處理業務的入口。使用者如果不重寫過濾器,使用預設的過濾器UsernamePasswordAuthenticationFilter。它繼承了抽象類AbstractAuthentic

Spring Boot @Enable*註解原始碼解析定義@Enable*

  Spring Boot 一個重要的特點就是自動配置,約定大於配置,幾乎所有元件使用其本身約定好的預設配置就可以使用,大大減輕配置的麻煩。其實現自動配置一個方式就是使用@Enable*註解,見其名知其意也,即“使什麼可用或開啟什麼的支援”。 ### Spring Boot 常用@Enable* 首先來簡

Spring Data實現分散式共享session

1、自定義HttpSession實現Session https://www.cnblogs.com/youzhibing/p/7348337.html 2、Spring整合Jedis2.9(叢集帶密碼版) https://blog.csdn.net/cslucifer/article/d

Spring Session + Redis實現分散式Session共享

通常情況下,Tomcat、Jetty等Servlet容器,會預設將Session儲存在記憶體中。如果是單個伺服器例項的應用,將Session儲存在伺服器記憶體中是一個非常好的方案。但是這種方案有一個缺點,就是不利於擴充套件。 目前越來越多的應用採用分散式部署,

使用Spring Session實現分散式Session共享

之前在分散式環境下需要解決session共享的問題,更多的時候我們是使用servlet容器例如tomcat提供的叢集配置來解決session的複製問題。今天介紹一種簡單的解決方案。 1 1. 新增依賴 <dependency> <gro

springboot+redis實現分散式session共享

    官方文件,它是spring session專案的redis相關的一個子文件:https://docs.spring.io/spring-session/docs/2.0.0.BUILD-SNAPSHOT/reference/html5/guides/boot

spring+redis自主實現分散式session(非spring-session方式)

背景:最近對一個老專案進行改造,使其支援多機部署,其中最關鍵的一點就是實現多機session共享。專案有多老呢,jdk版本是1.6,spring版本是3.2,jedis版本是2.2。 1.方案的確定 接到這專案任務後,理所當然地google了,一搜索,發現結果分為兩大類: tomcat的session管

基於 spring-session 解決分散式 session 共享問題

摘要:本文主要研究 基於 spring-seesion 解決分散式 session 的共享問題。首先講述 session 共享問題的產生背景以及常見的解決方案;然後講解本文主要研究的 spring-session 的概念和功能;接著演示了 spring-session 的兩種

Redis實現分散式session功能的共享

最近專案設計叢集,實現了一下session的共享功能,其原理是將session儲存到分散式快取資料庫中如:redis, memcache等,然後多個伺服器tomcat 每次請求都通過NoSql資料庫查詢,如果存在,則獲取值;反之存放值。 我是通過redis來實現

Spring Boot中使用Spring Session解決分散式會話共享問題

如果你正在使用Java開發Web應用,想必你對HttpSession非常熟悉,但我們知道HpptSession預設使用記憶體來管理Session,如果將應用橫向擴充套件將會出現Session共享問題。 Spring Session提供了一套建立和管理Servlet Ht

SpringBoot整合Shiro,許可權的動態載入、更新,Shiro-Redis實現分散式Session共享

本文章是介紹SpringBoot整合Apache Shiro,並實現在專案啟動時從資料庫中讀取許可權列表,在對角色進行增刪改時,動態更新許可權以及在分散式環境下的Session共享,Session共享使用的是shiro-redis框架,是根據真實專案寫的一個Demo。網上有很

asp.net mvc 用Redis實現分散式叢集共享Session

1、這兩天研究Redis搞分散式session問題,網上找的資料都是用ServiceStack.Redis來實現的,但是在做效能測試的時候發現最新的v4版本有限制每小時候最多請求6000次,因為官網開始商業化要收費了,好坑爹的說,還好我前期弄了個性能測試列子,不然上線以後

redis實現分散式session共享

在講解redis分散式session共享之前,我們先聊聊tomcat中session管理機制,包括:請求過程中session操作,sessionid解析過程,servlet獲取session流程,以及tomca中session的管理機制。 Tomcat session管理機制 請求過程中的session操

Redis學習筆記~StackExchange.Redis實現分散式Session

回到目錄 對於多WEB的環境現在已經是必須的了,很難想像一臺WEB伺服器面對百萬併發的響應,所以,我們需要多臺WEB伺服器叢集合作,來緩解這種高併發,高吞吐的場景,而對於多WEB的場景又會有個問題出現,即session儲存的問題,如一個使用者登陸後,把一個狀態資訊儲存到當前WEB伺服器的session裡,而

Spring boot整合websocket實現分散式websocketsession共享(一)--基於redis的釋出訂閱

本文主要是針對分散式場景下的使用websocket的一個解決方案。我們以下面的圖來說明下業務使用場景。   針對如圖的情況,很多人第一時間想到的是websocket的session共享,這是大多數的第一反應。很遺憾的是,websocketsession是不支援序列化操作

shiro整合redis實現分散式session和單點登入

shiro是一款出色的許可權框架,能夠實現諸如登入校驗、許可權校驗等功能,預設情況下,shir將session儲存到記憶體中,這在應用分散式部署的情況下會出現session不一致的問題,所以我們要將session儲存到第三方,應用始終從第三方獲取session,從而保證分散式

ASP.NET Core中介軟體實現分散式 Session

1.1. 中介軟體原理 1.1.1. 什麼是中介軟體 中介軟體是段程式碼用於處理請求和響應,通常多箇中間件連結起來形成管道,由每個中介軟體自己來決定是否要呼叫下一個中介軟體。 1.1.2. 中介軟體執行過程 舉一個示例來演示中介軟體的執行過程(

shiro(四)整合redis實現分散式session

一、前言 前面的文章中,shiro使用的是ehcache做快取,這樣在單機服務中,沒有任何問題,但是如果是在叢集環境下,就無法實現session共享了。分散式session有多種實現方式: 1. Session Replication 方式管理 (即session複製)