вот код, который может воспроизвести этот вопрос:Spring Жизненный цикл выпуска: аннотацию @SessionAttributes делает атрибуты сеанса живут дольше, чем на самой сессии
@Controller
public class FirstController {
@RequestMapping(value = "firstpage", method = GET)
public String myHander(HttpSession httpSession) {
if (httpSession.getAttribute("someClass") == null) {
httpSession.setAttribute("someClass", new SomeClass());
}
return "firstpage";
}
}
первый контроллер помещает что-то в сессии, если он еще не существует ,
@Controller
@SessionAttributes(types = SomeClass.class)
public class SecondController {
@RequestMapping(value = "secondpage", method = GET)
public String myHandler(SomeClass someClass, HttpSession httpSession) {
//asking spring for the SomeClass parameter, that's why we put it in the annotation.
System.out.print(someClass.hashCode());
httpSession.invalidate();
return "secondpage";
}
}
Второй контролер убивает сессию.
и в обоих файлах JSP, у меня есть следующий код, который печатает хэш-код объекта сеанса и хэш-код атрибута сеанса:
session hash:
<%= session.hashCode() %>
<br/>
someclass hash:
<%= session.getAttribute("someClass").hashCode() %>
теперь, если я запустить приложение и посетить «Firstpage», я получу это:
сессии хэш: 1838367636
SomeClass хэш: 1075505853
, а затем я посетить "SecondPage", и получите это:
сессии Хэш: 842656294
SomeClass хэш: 1075505853
мы можем увидеть, что сама сессия изменяется , потому что второй контроллер убивает сеанс. но атрибут сеанса (типа SomeClass) остается неизменным.
тогда, если я попытаюсь пересмотреть «вторую страницу», объект сеанса будет меняться каждый раз, но атрибут сеанса останется прежним.
Почему атрибут сеанса (который должен быть присоединен к сеансу) имеет более длительный жизненный цикл, чем сам сеанс?
PS: полный код здесь: https://github.com/cuipengfei/One-hundred-thousand-why/tree/master/20130701SessionAttributesLifeCycle/SpringMVC
вы можете запустить его с МВН причалу: работать, чтобы воспроизвести проблему.