管理通过@SessionAttributes声明的控制器特定会话属性。实际存储被委派给SessionAttributeStore 实例。
当用@SessionAttributes 注释的控制器将属性添加到模型中时,这些属性将根据@sessionAttribute指定的名称和类型进行检查。匹配的模型属性保存在HTTP会话中,并保留在那里,直到控制器调用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接口
可以注入处理程序方法的简单接口,允许它们发出会话处理完成的信号。然后,处理程序调用程序可以跟踪适当的清理,例如在处理程序处理期间隐式创建的会话属性(根据@SessionAttributes注释)。
实现类SimpleSessionStatus
1.2 @SessionAttributes注解
表示特定处理程序使用的会话属性的注释。
这通常会列出模型属性的名称,这些属性应该透明地存储在会话或一些会话存储中,用作表单备份bean。在类型级别声明,应用于带注释的处理程序类操作的模型属性。
注意:使用此注释指示的会话属性对应于特定处理程序的模型属性,透明地存储在会话会话中。一旦处理程序指示会话会话会话完成,这些属性将被删除。因此,对于这些会话属性,可以使用此工具,这些属性应该在特定处理程序的会话过程中临时存储在会话中。
对于永久会话属性,例如用户身份验证对象,使用传统的session.setAttribute 方法。或者,考虑使用泛型的属性管理功能org.springframework.web.context.request.WebRequest 接口。
注意:当使用控制器接口时(例如用于AOP代理),请确保一致地将所有映射注释(如@RequestMapping和@SessionAttributes)放在控制器接口上,而不是放在实现类上。
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方法
将提供的属性存储在后端会话中。
可以为新属性和现有属性调用。在后一种情况下,这表示属性值可能已被修改。
2.2 retrieveAttribute方法
从后端会话检索指定的属性。
调用该方法时,通常期望属性已经存在,如果该方法返回null,则抛出异常。
2.3 cleanupAttribute方法
清除后端会话中的指定属性。
指示属性名称将不再使用。
2.4 attributeNamePrefix属性
指定用于后端会话中属性名称的前缀。
默认设置是不使用前缀,以与模型中相同的名称存储会话属性。
2.5 实现类DefaultSessionAttributeStore
SessionAttributeStore接口的默认实现,将属性存储在WebRequest会话(即HttpSession)中。
网友评论