Spring mvc之SessionAttributesHandler类

管理通过@SessionAttributes声明的控制器特定会话属性。实际存储被委派给SessionAttributeStore 实例。

当用@SessionAttributes 注释的控制器将属性添加到模型中时,这些属性将根据@sessionAttribute指定的名称和类型进行检查。匹配的模型属性保存在HTTP会话中,并保留在那里,直到控制器调用SessionStatus

    private final Set attributeNames = new HashSet<>();

    private final Set> attributeTypes = new HashSet<>();

    private final Set 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)中。

3. WebRequest接口

4. ServletWebRequest类

你可能感兴趣的:(Spring mvc之SessionAttributesHandler类)