22.Spring-Boot中Spring Session介紹


官方文檔:https://docs.spring.io/spring-session/docs/2.0.2.RELEASE/reference/html5/   

 在單應用中我們的session來保存用戶信息,通常會保存在服務器中(如tomcat),但是我們把應用搭建成分布式的集群,然后利用LVS或Nginx做負載均衡,那么來自同一用戶的Http請求將有可能被分發到兩個不同的應用中。

   那么如何解決在分布式中的session共享問題。可行的方案有memcached實現session共享,也可以用redis實現。今天主要介紹Spring Session.

    Spring Session提供了一個API和實現來管理用戶的會話信息,同時也使得支持集群會話而不被綁定到應用程序容器特定的解決方案而變得微不足道。

     實際上,我們不使用Tomcat的HttpSession,而是將session Id值持久化到Redis中。Spring Session將使用由Redis支持的實現替換HttpSession。

主要是通過對請求和相應session的封裝:

SessionRepositoryFilter:

   基於Spring Boot的Spring Session介紹。

 

  (1)pom.xml配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
<dependency>
     <groupId>org.springframework.session</groupId>
     <artifactId>spring-session-data-redis</artifactId>
</dependency>

 

在添加所需的依賴項之后,可以創建Spring Boot配置。感謝自動配置支持,在Redis的支持下設置Spring Session就像在您的應用程序中添加一個配置屬性一樣簡單。

(2)application.properties配置

#session存儲類型
spring.session.store-type=redis
#設置session超時時間
server.session.timeout=2000
spring.redis.host=127.0.0.1
spring.redis.port=6379

 

(3)controller中測試

@RequestMapping(value = "/index", method = RequestMethod.POST)
@ResponseBody
public PageResultBean<User> index(UserQuery query, HttpServletRequest request) {
   HttpSession session = request.getSession();
    if (session.getAttribute("user") == null) {
      session.setAttribute("user", "zhangsan");
      System.out.println("不存在session");
    } else {
     System.out.println("存在session");
   }
  List<User> list = userService.queryListByPage(query);
  int queryCount = userService.queryCount(query);
  PageResultBean<User> pageResultBean = new PageResultBean<User>();
  pageResultBean.setData(list);
  pageResultBean.setPageNumber(query.getPageNumber());
  pageResultBean.setPageSize(query.getPageSize());
  pageResultBean.setTotalCount(queryCount);
  return pageResultBean;
}

 

對於第一次請求會打印,“不存在session”,這時候就會創建session,並保存到Redis中,同時也會返回給瀏覽器。

 "spring:session:expirations:1521635340000" set類型
 "spring:session:sessions:7e995929-f063-4779-a382-e831bdb88386" 是hash類型

 "spring:session:sessions:expires:7e995929-f063-4779-a382-e831bdb88386"  string類型 

通過 hkeys  spring:session:sessions:7e995929-f063-4779-a382-e831bdb88386  ,查詢所有的fields

maxInactiveInterval   session活躍時間(多少秒后過期) ,默認為180s 30min 
lastAccessedTime  最后一次訪問會話的時間 距離1/1/1970 的毫秒
creationTime  session創建時間距離1/1/1970 的毫秒
sessionAttr:user  為session中的一個屬性,一般是在程序中自定義的

 微信公眾號

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM