管理通過@SessionAttributes聲明的控制器特定會話屬性伦仍。實際存儲被委派給SessionAttributeStore 實例。
當(dāng)用@SessionAttributes 注釋的控制器將屬性添加到模型中時很洋,這些屬性將根據(jù)@sessionAttribute指定的名稱和類型進行檢查充蓝。匹配的模型屬性保存在HTTP會話中,并保留在那里喉磁,直到控制器調(diào)用SessionStatus
private final Set<String> attributeNames = new HashSet<>();
private final Set<Class<?>> attributeTypes = new HashSet<>();
private final Set<String> knownAttributeNames = Collections.newSetFromMap(new ConcurrentHashMap<>(4));
private final SessionAttributeStore sessionAttributeStore;
1.1 SessionStatus接口
可以注入處理程序方法的簡單接口谓苟,允許它們發(fā)出會話處理完成的信號。然后协怒,處理程序調(diào)用程序可以跟蹤適當(dāng)?shù)那謇砝员海缭谔幚沓绦蛱幚砥陂g隱式創(chuàng)建的會話屬性(根據(jù)@SessionAttributes注釋)。
實現(xiàn)類SimpleSessionStatus
1.2 @SessionAttributes注解
表示特定處理程序使用的會話屬性的注釋孕暇。
這通常會列出模型屬性的名稱仑撞,這些屬性應(yīng)該透明地存儲在會話或一些會話存儲中,用作表單備份bean妖滔。在類型級別聲明隧哮,應(yīng)用于帶注釋的處理程序類操作的模型屬性。
注意:使用此注釋指示的會話屬性對應(yīng)于特定處理程序的模型屬性座舍,透明地存儲在會話會話中沮翔。一旦處理程序指示會話會話會話完成,這些屬性將被刪除簸州。因此鉴竭,對于這些會話屬性歧譬,可以使用此工具,這些屬性應(yīng)該在特定處理程序的會話過程中臨時存儲在會話中搏存。
對于永久會話屬性瑰步,例如用戶身份驗證對象,使用傳統(tǒng)的session.setAttribute 方法璧眠∷踅梗或者,考慮使用泛型的屬性管理功能org.springframework.web.context.request.WebRequest 接口责静。
注意:當(dāng)使用控制器接口時(例如用于AOP代理)袁滥,請確保一致地將所有映射注釋(如@RequestMapping和@SessionAttributes)放在控制器接口上,而不是放在實現(xiàn)類上灾螃。
2. SessionAttributeStore接口
在后端會話中存儲模型屬性的策略接口题翻。
接口定義如下:
public interface SessionAttributeStore {
void storeAttribute(WebRequest request, String attributeName, Object attributeValue);
@Nullable
Object retrieveAttribute(WebRequest request, String attributeName);
void cleanupAttribute(WebRequest request, String attributeName);
}
2.1 storeAttribute方法
將提供的屬性存儲在后端會話中。
可以為新屬性和現(xiàn)有屬性調(diào)用腰鬼。在后一種情況下嵌赠,這表示屬性值可能已被修改。
2.2 retrieveAttribute方法
從后端會話檢索指定的屬性熄赡。
調(diào)用該方法時姜挺,通常期望屬性已經(jīng)存在,如果該方法返回null彼硫,則拋出異常炊豪。
2.3 cleanupAttribute方法
清除后端會話中的指定屬性。
指示屬性名稱將不再使用拧篮。
2.4 attributeNamePrefix屬性
指定用于后端會話中屬性名稱的前綴词渤。
默認(rèn)設(shè)置是不使用前綴,以與模型中相同的名稱存儲會話屬性串绩。
2.5 實現(xiàn)類DefaultSessionAttributeStore
SessionAttributeStore接口的默認(rèn)實現(xiàn)掖肋,將屬性存儲在WebRequest會話(即HttpSession)中。