Verwirrung wegen Sitzungszeitüberschreitung – session.setMaxInactiveInterval(0)
-
26-12-2019 - |
Frage
Ich bin neu bei JEE und das verwirrt mich.Entsprechend HttpSession.html#setMaxInactiveInterval(int Intervall) Dokumentation
Ein
interval
Wert vonzero
oder weniger zeigt an, dass die Die Sitzung sollte niemals eine Zeitüberschreitung aufweisen.
aber laut meinem Lehrbuch (das schon ein paar Jahre alt ist – daher gehe ich davon aus, dass es nicht immer richtig ist) sollte die Verwendung von Null als Argument zu einem sofortigen Timeout der Sitzung führen.
Dieser Code
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("foo", 42);
session.setMaxInactiveInterval(0);
out.println(session.getAttribute("foo"));//problem here
}
}
Die Verwendung bei Glassfish 4.0 scheint die Theorie aus dem Lehrbuch zu bestätigen und nicht aus einer neueren offiziellen Dokumentation, da sie zurückkehrt HTTP-Status 500 – Interner Serverfehler mit Fehlermeldung
java.lang.IllegalStateException: getAttribute: Session already invalidated
Was geht hier vor sich?Ist dieser Glassfish 4.0-Fehler oder die Dokumentation falsch?Oder gibt es vielleicht eine dritte Option?
PS.Dieser Code funktioniert wie er sollte mit negativen Werten (Sitzung wird nicht ungültig gemacht) und ich verwende -1
anstatt 0
in meinem Code.Mich interessiert nur, was los ist 0
.
Lösung
Der Servlet-Spezifikation Kapitel über Sitzungs-Timeouts besagt
Wenn der Zeitraum für eine Sitzung auf -1 festgelegt ist, läuft die Sitzung nie ab.
GlasshFish scheint das also abgedeckt zu haben.Ich kann in der Spezifikation keinen Hinweis finden, der besagt, dass dasselbe für einen Wert von gelten sollte 0
mit setMaxInactiveInterval()
.Allerdings heißt es
Der
session-config
Definiert die Sitzungsparameter für diese Webanwendung.Das Unterelementsession-timeout
Definiert das Standard -Sitzungsintervall für alle in dieser Webanwendung erstellten Sitzungen.Die angegebene Auszeit muss in einer ganzen Anzahl von Minuten ausgedrückt werden. Wenn das Timeout 0 oder weniger beträgt, Der Container stellt sicher, dass das Standardverhalten von Sitzungen niemals zum Zeitpunkt kommt.Wenn dieses Element nicht angegeben ist, muss der Container seine Standardzeit festlegen.
Andere Tipps
Dies ist bereits eine Zeitüberschreitung und ungültig
session.setMaxInactiveInterval(0); // mean inactive immediately
Das ist also die richtige Fehlermeldung.(Weitere Informationen finden Sie im Hauptbuch.)
Sie versuchen, auf einen Objektwert zuzugreifen, der nicht vorhanden ist.es ist bereits zerstört