鍍金池/ 問答/Java/ spring如何共享controller里面的session?

spring如何共享controller里面的session?

這個問題源于驗證碼的獲取與驗證,在AController里面獲取生成驗證碼,放到session,如何在BController里面獲???

回答
編輯回答
櫻花霓

只要sessionId一致就可以訪問到相應(yīng)session里面的數(shù)據(jù)

當客戶端第一訪問服務(wù)器的時候,服務(wù)器會返回一個sessionId,一般瀏覽器會使用cookie自動保存sessionId,然后下次請求的時候把這個sessionId帶上,就可以獲取該sessionId對應(yīng)的session的數(shù)據(jù),也就可以這樣獲取數(shù)據(jù)

HttpServletRequest req;
req.getSession().getAttribute();
2017年11月21日 10:52
編輯回答
焚音

HttpServletRequest req
req.getSession().getAttribute();

2017年4月8日 22:33
編輯回答
故人嘆

不同請求session是不一樣的,當然獲取不到,看下Spring Session

2017年2月9日 14:01
編輯回答
別傷我

這個問題的話,如果是單服務(wù)器,單應(yīng)用,在 Spring Boot 中可以這樣寫 Controller:

根據(jù)題主的問題,我這里定義兩個 Controller:

  • SetController: 生成驗證碼
  • GetController: 驗證驗證碼

SetController.java

@RestController
public class SetController {

    @GetMapping(value = "/set")
    public String setAttribute(HttpSession session) {

        String uuid = UUID.randomUUID().toString();
        session.setAttribute("uuid", uuid);

        return uuid;
    }

}

GetController.java

@RestController
public class GetController {

    @GetMapping("/get")
    public String getAttribute(HttpSession session) {

        return (String) session.getAttribute("uuid");

    }
}

上述兩個簡單的 Controller 演示了在 Spring 中如何存儲和讀取 Session 中的內(nèi)容。

如果是單應(yīng)用,多服務(wù)器的話,我能想到的有以下兩種解決方案:

1. 使用 Spring Session 分布式存儲 Session

  • 應(yīng)用配置配置文件(yaml 格式)
# 使用 Redis 存儲分布式會話
spring:
  session:
    store-type: redis
  • 注入相關(guān)的 Bean
@Configuration
@EnableRedisHttpSession
public class SpringSessionConfig {

    @Bean
    public JedisConnectionFactory connectionFactory() {
        return new JedisConnectionFactory();
    }

}

這種方式,之前的代碼不需要有任何改變,往 Session 中讀取和存入屬性依然使用 getAttrubite(key)setAttribute(key, value) 方法,Spring Session 把分布式會話透明化了。

2. 使用 Redis + Token

  • 為每次會話生成一個唯一的 key 作為會話 ID
  • 為該會話 ID 生成會話對象
  • 為會話對象存儲驗證碼
  • 會話對象存儲在 Redis 中
  • 驗證驗證碼時,將唯一的 key 作為 Token,通過 HTTP 首部或者 Cookie 中發(fā)送請求
  • 服務(wù)器端,解析請求,從 Redis 中讀取對應(yīng) key 的驗證碼

當然,第二種方式是自己手動維護了一個 Session 機制,還有會話過期、令牌回收、有效性檢查等多方面因素,需謹慎考慮。

2018年2月8日 06:45
編輯回答
心夠野

驗證碼不建議存放于Session中,可以考慮存于Redis 或者memcached中

2017年7月15日 04:03