adr-wisniewski / inz-sd

Automatically exported from code.google.com/p/inz-sd
0 stars 0 forks source link

Adnotacja @SessionAttributes #12

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
Problem:
Adnotacja zapisuje obiekty w sesji, które nie są czyszczone i zostają przez
cały czas trwania aplikacji. Powoduje to, że wzorzec post-redirect-get nie
chroni przed podwójnym wysłaniem formularza, bo po naciśnięciu wstecz
strona z formularzem jest wyświetlana ponownie (bo @ModelAttribute zwraca
poprawny obiekt) i użytkownik może ponownie wysłać dane. Usunięcie 
obiektów
z sesji raz że zmniejszy ilość zajmowanego miejsca, dwa że przy próbie
ponownego wyświetlenia formularza poleci wyjątek i zostanie wyświetlona
strona, że formularz jest już nieaktualny.

Rozwiązanie:
W każdym kontrolerze oznaczonym tą adnotacją należy:
1) do parametrów metody post dodać: SessionStatus status 
2) przed przekierowaniem dodać: status.setComplete();

Original issue reported on code.google.com by SirIz...@gmail.com on 29 May 2010 at 9:29

GoogleCodeExporter commented 9 years ago
Mniej ważne, ale kiedyś na przyszłość - że adnotacji @SessionAtributes i 
metody post
nie powinno stosować się w przypadkach kontrolerów wyszukiwania. 

Dlaczego nie post? Bo użytkownik czasami będzie chciał zapamiętać wyniki 
wyszukiwania
poprzez dodanie linka do zakładek. 

A dlaczego nie @SessionAttributes? Bo przechowywanie obiektu w sesji jest 
potrzebne
tylko w przypadku implementacji wzorca redirect after post. Warto przeczytać
http://www.theserverside.com/news/1365146/Redirect-After-Post (diagram
http://media.techtarget.com/tss/static/articles/content/RedirectAfterPost/images
/redir_chart1.gif).
W przypadku wyszukiwania obiekt kryterium można zrekonstruować w całości z 
parametrów
żądania - wystarczy umieścić w kontrolerze metoda oznaczona @ModelAttribute 
i z
return new Object().

Original comment by SirIz...@gmail.com on 2 Jun 2010 at 6:24