來源於 https://blog.csdn.net/yiifaa/article/details/77542208
1. 利用@SessionAttribute進行獲取
這是最簡單直接的方法,可以直接在方法的參數中直接進行注入,如下:
// 可以直接從Session中抓取域對象
public Account login(@SessionAttribute Account account) {
return account;
}
上面的方法雖然簡單,但是唯一的缺點是Spring Framework 4.3之前的版本不支持。
2. 利用@SessionAttributes進行獲取
與@SessionAttribute不同的是,@SessionAttributes不僅多了一個復數“s”,而且從Spring Framework 2.5版本就開始支持,此外@SessionAttributes還必須注解在類上,這樣類里面的所有方法就可以直接通過@ModelAttribute獲取域對象,所以總結起來,@SessionAttributes抓取域對象分為兩步;
1. 在類上添加注解@SessionAttributes;
2. 在方法的參數中通過@ModelAttribute獲取域對象;
@RestController
@SessionAttributes("account")
public class SecurityContextController {
@RequestMapping("/account")
public Account login(@ModelAttribute("account") Account account) {
return account;
}
}
此外,我們不妨把@SessionAttributes的官方說明重讀一遍,以了解它的真正含義,如下:
This will typically list the names of model attributes
which should be transparently stored in the session or some conversational storage,
serving as form-backing beans.
Declared at the type level,
applying to the model attributes that the annotated handler class operates on.
大概意思是@SessionAttributes會列出存儲在Session或會話中的域對象,就像表單的后台對象一樣提供服務,並且必須注解在類型上,並應用於此類的域對象上。
3. 直接通過Session獲取
這個更簡單,直接通過HttpSession獲取,但需要更多的類型判斷與轉換代碼,如下:
@RequestMapping("/account")
public Account account(HttpSession session) {
Object obj = session.getAttribute("account");
if(obj instanceof Account) {
Account account = (Account) obj;
return account;
}
return null;
}
為了簡化Session的調用,充分利用@ModelAttribute方法的初始化特性,我們還可以改進為如下的形式:
public class SecurityContextController {
ThreadLocal<Account> authContext = new ThreadLocal<>();
// 此方法會在每次請求前調用(這個類的處理方法)
@ModelAttribute
public void initUser(HttpSession session) {
Object obj = session.getAttribute("account");
if(obj instanceof Account) {
Account user = (Account) obj;
authContext.set(user);
}
}
// 現在可直接使用存儲的屬性
@RequestMapping("/getUser")
public AegisUser get() {
return authContext.get();
}
}
結論
在Spring Boot中,從Session中獲取域對象還是比較容易的,唯一可能引起誤解或較難使用的只有@SessionAttributes,一定要記住它的二個使用步驟
————————————————
版權聲明:本文為CSDN博主「蟻方陣」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yiifaa/article/details/77542208