コントローラーの終了後にセッション属性がクリアされるかどうかについては、大きな議論があります。
明確にするために、 Spring MVC 3.1.0 RELEASEソースコードを見ることができます。
インターフェースorg.springframework.web.bind.support.SessionAttributeStoreは、次のメソッドを公開します。
void storeAttribute(WebRequest request, String attributeName, Object attributeValue);
Object retrieveAttribute(WebRequest request, String attributeName);
void cleanupAttribute(WebRequest request, String attributeName);
デフォルトの実装はorg.springframework.web.bind.support.DefaultSessionAttributeStoreです
Eclipse のcleanupAttribute()で「Open Call Hierarchy」を実行すると、メソッドが 2 つの異なるフローによって呼び出されることがわかります。
1) org.springframework.web.method.annotation.ModelFactory
public void updateModel(NativeWebRequest request, ModelAndViewContainer mavContainer) throws Exception {
if (mavContainer.getSessionStatus().isComplete()){
this.sessionAttributesHandler.cleanupAttributes(request);
}
else {
this.sessionAttributesHandler.storeAttributes(request, mavContainer.getModel());
}
if (!mavContainer.isRequestHandled()) {
updateBindingResult(request, mavContainer.getModel());
}
}
2) org.springframework.web.bind.annotation.support.HandlerMethodInvoker
public final void updateModelAttributes(Object handler, Map<String, Object> mavModel,
ExtendedModelMap implicitModel, NativeWebRequest webRequest) throws Exception {
if (this.methodResolver.hasSessionAttributes() && this.sessionStatus.isComplete()) {
for (String attrName : this.methodResolver.getActualSessionAttributeNames()) {
this.sessionAttributeStore.cleanupAttribute(webRequest, attrName);
}
}
...
}
どちらの場合も、セッション属性はthis.sessionStatus.isComplete()が呼び出されたときにのみ削除されることは明らかです。
DefaultSessionAttributeStoreのコードを掘り下げました。内部では、実際のHTTP セッションオブジェクトを取得して属性を保存するため、同じセッション内の他のコントローラーからアクセスできる可能性があります。
いいえ、セッション属性はクリーン POST 後に削除されません。