Существует большая дискуссия о том, очищаются ли атрибуты сеанса после выхода из контроллера.
Чтобы уточнить раз и навсегда, мы можем взглянуть на исходный код 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
Выполнив « Открытая иерархия вызовов » на cleanupAttribute () в Eclipse, мы можем видеть, что метод вызывается двумя различными потоками:
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 Session для хранения атрибутов, поэтому к ним потенциально могут обращаться другие контроллеры в одном сеансе.
Так что нет, атрибуты сеанса не удаляются после чистого POST.