セッションベースの分散一貫性を解決するのRedis

1.sessionは何ですか

ユーザーがフロントエンドで要求を開始すると、サーバーは、現在のセッションのユーザーを作成し、サーバはセッションIDがクライアントに戻って書いただろう、限り、ユーザーがブラウザを閉じないように、サーバ要求は再び、セッションIDは、サーバに渡さ

サーバーは、セッションIDに応じて、そのサービスに対応するセッションを検索します。

 分散展開時に、セッションが次回ユーザ要求上、サーバ側に格納され、ロードバランシング、他のサーバノードに分散されてもよい、一貫セッションの問題に対処するため、必要性、

分散セッションを使用して実装することがRedisの、個人的な理解がRedisの中に保存されたセッションは、時間は各要求のために来たということで、Redisのセッションから情報を読み取り

 

2.コードの実装

 依存性は、導入する必要が①.maven

  

<依存性> 
    <のgroupId> org.springframework.boot </のgroupId> 
    <たartifactId>ばねブートスタータウェブ</たartifactId> 
</依存> 
<依存性> 
    <のgroupId> org.springframework.session </のgroupId> 
    <たartifactId >春・セッション</たartifactId> 
</依存関係>

②。Redisのコンフィギュレーションファイルは、IPアドレスとポートを指定します

spring.redis.host = 172.18.66.45 
spring.redis.port = 6379

 

③.httpSession設定

パッケージcom.session.config。

輸入org.springframework.beans.factory.annotation.Value。
輸入org.springframework.context.annotation.Bean。
輸入org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
輸入org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession。
// maxInactiveIntervalInSeconds设置セッション有效时间、单位是秒;默认是30分钟 
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 180 パブリック クラスSessionConfig { 
    
    @value( "$ {spring.redis.host}" プライベート文字列のホスト名。
    @値("$ {spring.redis.port}" プライベート int型ポート。

    @Bean 
    公共JedisConnectionFactoryはconnectionFactory(){ 
        JedisConnectionFactoryはconnectionFactory = 新しいJedisConnectionFactory()。
        connectionFactory.setPort(ポート); 
        connectionFactory.setHostName(で、hostName)。
        System.out.println( "获取到的ホスト名是:" +で、hostName + "ポート:" + ポート)。
        返却はconnectionFactoryを。
    } 
}

 

そして、コントローラを実装するには、ログインセッションかどうかをチェック、ユーザーに応じて、セッションを書いて、実際のビジネスシナリオをシミュレートすることができます

パッケージcom.session.controller。

インポートのjavax.servlet.http.HttpServletRequest;
輸入javax.servlet.http.HttpSession。

輸入org.springframework.web.bind.annotation.RequestMapping。
輸入org.springframework.web.bind.annotation.RestController。

@RestController 
パブリック クラスSessionController { 

    // 模拟第一次登陆时、保存セッション 
    @RequestMapping(値= "/ログイン" パブリック文字列ログイン(HttpServletRequestのリクエスト){ 
        HttpSessionのセッション = でrequest.getSession(); 
        文字列str =(文字列)session.getAttribute( "ユーザー情報" )。
        IF(STR == NULL || "" .equals(STR)){ 
            にsession.setAttribute( "ユーザー情報"、 "セッションMPYテスト" );
             戻り "成功ログイン-SUCCESS" ; 
        } {
             リターン「セッションデータが存在します、ユーザは、「ログインした; 
        } 
    } 

    / * 次に、本方法は、モードを着陸、コールサービス・インターフェースは、
*実際のビジネスシナリオでは、インターセプタは、各要求のために使用することができるユーザのログイン認証するかどうかを判定し、セッションの有効期限が切れました
/ * @RequestMapping(値= "/のgetSession" パブリック文字列のgetSession(HttpServletRequestの要求){ HttpSessionのセッション =でrequest.getSession(); STR文字列 =(文字列)session.getAttribute( "ユーザー情報" ); IF(STR == NULL || "" .equals(STR)){ リターン "セッションでないデータは、記号" ; } そうで{ // ログインユーザ、他のサービス・コードの処理 のSystem.out.println(「セッション属性である:」+ STR); 戻りSTR; } } @RequestMapping(値 =「/ジンバブエログアウト」パブリック文字列ジンバブエログアウト(HttpServletRequestの要求){ HttpSessionのセッション = でrequest.getSession(); 文字列str=(文字列)session.getAttribute( "ユーザー情報" )。 もし(!STR = ヌル && "" .equals(文字列)){ はsession.invalidate(); } 戻り "退出成功" } }

 

 検討することを学ぶの原則@EnableRedisHttpSessionと春セッション

//github.com/mapy95/spring-session.git:特定のコードは、HTTPS、GitHubのにアップロードされました

おすすめ

転載: www.cnblogs.com/mpyn/p/11069179.html