2015-10-20 8 views
6

Mam dziwne zachowanie w mojej aplikacji Spring MVC 3.2 i zauważyłem, że dzieje się tak tylko wtedy, gdy przekierowanie odbywa się w sposób alternatywny; więc moje pytania są następujące:Wiosną MVC, czy użycie "przekierowania: proces" lub "przekierowanie:/proces" różni się w odniesieniu do utraty wartości sesji lub sesji?

  1. robi 'przekierowanie:/proces' żadnego różnej od 'przekierowanie: procesowej' za przekierowanie do kontrolera wewnętrznego?

    Czy dodany ukośnik ma znaczenie, na przykład podczas obsługi sesji?

  2. Jakie są powody utraty sesji (lub utraconych atrybutów sesji)?

    Jest wartość, którą przeczytałem w mojej aplikacji; nawet ty wykonujesz przekierowania w wielu przypadkach, kiedy dodaję slash przed URI kontrolera, przy produkcji Czasami tracę tę wartość.

    Każda wskazówka, jak rozwiązać problem z utraconą wartością sesji?

Uwaga: Używam Metody httpRequest.getSession().setAttribute i httpSession.getAttribute dostępu sesji.

+0

Stacktrace? Błąd? Kod powodujący błąd? –

+0

Otrzymuję wyjątek NullPointerException z powodu wartości pobieranej z sesji o wartości NULL. Zdarza się to kilkanaście razy w ciągu dnia. –

+0

To dzieje się w metodzie kontrolera GET, kiedy zwracam (jako nazwę widoku) wartość "przekierowanie:/proces". Uwaga: nie mogę odtworzyć tego lokalnie. –

Odpowiedz

0

Tylko uwaga: / to ukośnik, ukośnik odwrotny to \.

Z wyjątkiem przyczyn zewnętrznych z powodu innych błędów, ani redirect:process ani redirect:/process nie powinny zmieniać niczego tak długo, jak dotyczy sesji.

Ale te 2 przekierowania to , a nie podobno to samo, chyba że znajdujesz się na głównej stronie aplikacji. Zakładając, że aplikacja działa na porcie HTTP 80 na serwerze.domena, z kontekstem serwletu myapp, a przetwarzasz żądanie na numer http://server.domain/myapp/local/part, redirect:process, poprosiłbyś przeglądarkę, aby zażądała http://server.domain/myapp/local/part/process, gdy redirect:/process poprosi przeglądarkę, aby zażądała http://server.domain/myapp/process.

To, co dzieje się dalej, zależy od mapowań kontrolera.

+0

To jest niesamowicie dziwne. Otrzymuję odpowiedź na temat identyfikatora URI kontrolera "http: // domain/app/result", ale robię "przekierowanie: proces" Uderzam w kontroler mający "proces" żądania (a nie "wynik/proces"). Na podstawie Twojego opisu nie powinno być to możliwe. –

+0

Czy wartość @RequestMapping dla kontrolera "/process.htm"? Jeśli tak, czy próbowałeś użyć "redirect: /process.htm"? – QuestionMarks

+0

Nie, nie ma sufiksu ".htm", docieram do poprawnego kontrolera, ale przegrywanie sesji, czy robię "przekierowanie: przetwarzanie" lub "przekierowanie:/proceess", jest takie samo. –

1

z "/" deklarujesz ścieżkę z katalogu głównego, który jest ścieżką kontekstu serwletu. bez '/', zwykle idzie do ścieżki względem twojej obecnej ścieżki podrzędnej. na przykład, jeśli jesteś w "/ go/url", twój wskazuje na "/ go/url/next", a nie "/ next".

Nie sprawdzałem źródłowego kodu źródłowego, ale tak to zwykle działa w przeglądarce internetowej.

EDIT:

Przepraszam, Spring MVC, należy zawsze zapewnić pełną ścieżkę, a nie tylko ścieżkę względną. Więc powinieneś zrobić "przekierowanie:/full/path".

+0

Dobrze, i używam ścieżki zaczynającej się od '/' teraz, wszystko dobrze. Jednak nie widziałem, jak twoja odpowiedź jest istotna w odniesieniu do utraconych sesji. –

+0

Prawdopodobnie chcesz podwójnie sprawdzić, czy ustawiona wartość nie jest zerowa w pierwszej kolejności ... –

0

Prawdopodobnie chcesz przeanalizować, co powoduje utracone atrybuty sesji. Jednym z podejść byłoby wdrożenie własnej implementacji HttpSessionAttributeListener i zalogowanie się w wersji public void attributeRemoved(HttpSessionBindingEvent event).Należy również zachować poziom dziennika wiosennego do debugowania.

+0

Dzięki, jednak nie mogę używać debugowania podczas produkcji, a to nie jest jeszcze reprodukowane lokalnie. Więc zaimplementuję to, o czym wspomniałeś i zobaczysz, co się dzieje. –

Powiązane problemy