implizites session-Objekt in JSP

procurve

Erfahrenes Mitglied
Hi!

Wird beim Aufruf einer JSP-Seite automatisch eine Session erzeugt?

Zur Zeit versuche ich über session == null zu überprüfen, ob sich ein User angemeldet hat, oder nicht.
Dabei gibt es bei mir im Custom Tag das Problem, dass innerhalb der jsp eine Session erzeugt wird und ich somit nicht mehr unterscheiden kann, ob ein User angemeldet ist, oder nicht.

Ist das immer so, oder liegt ein Fehler vor? (evtl. auch ein Denkfehler?)
 
Code:
HttpSessionsession = request.getSession(false); // wird nicht automatisch erzeugt
if (session == null) {
  //...
}
 
Danke für die Antwort.

So mache ich das bisher auch. Ich versuch mal Quellcode zu posten:

Die Seite

HTML:
<%@ taglib uri="pp.core" prefix="pp" %>
<HTML>
	<HEAD>
		<TITLE>ppContacts entry point</TITLE>
	</HEAD>
	
	<BODY>
		<H1>pp Contacts - Login</H1>
		<P>Bitte einloggen!</P>
		<pp:login name="formLogin" action="#">
			Login-Formular
		</pp:login>
	</BODY>	
</HTML>

Das Custom-Tag (nur relevanten Teil gepostet)
Code:
public void setJspContext(JspContext pc) {	
		logger.debug("setJspContext");
		PageContext p = (PageContext)pc;
		HttpServletRequest request = (HttpServletRequest)p.getRequest();
		
		HttpSession session = request.getSession(false);		
		if (session != null) {
			logger.debug("session true");
		} else {
			logger.debug("session false");
		}
	}

Der Filter, der davor sitzt (nur relevanten Teil gepostet)
Code:
if (htmlRequest.getSession(false) == null) {
	logger.debug("session == null");
	// No user is set -> not logged in
	// Check, if requested uri grants anonymous access
		
	// else redirect to login if login.jsp is not target of this request ;)
	if (!htmlRequest.getRequestURI().contains("login.jsp")) {
		htmlResponse.sendRedirect("login.jsp?log=true");
	}
} else {
	logger.debug("session != null");
	// User is logged in -> check if user has access rights
			
	// if not display errorpage
			
}

chain.doFilter(request, response);
		
if (htmlRequest.getSession(false) == null) {
	logger.debug("again: session == null");
}

Logausgabe:
Code:
2007-08-08 00:08:49,110 DEBUG [http-8080-1] pp.security.LoginFilter: session == null
2007-08-08 00:08:49,110 DEBUG [http-8080-1] pp.security.LoginFilter: again: session == null
2007-08-08 00:08:49,262 DEBUG [http-8080-1] pp.web.tags.Login: setJspContext
2007-08-08 00:08:49,263 DEBUG [http-8080-1] pp.web.tags.Login: session true

Irgendwo zwischen Filter und Custom Tag wird die Session erzeugt und ich weiß leider nicht wo. nach genauere analyse über die Erstellungszeit der Session sieht es so aus, als ob sie im Konstruktor des Tags erstellt wird.

Kann es sein, dass das Tag selbst session-scoped ist? Wenn ja, wie stell ich das um?
 
Die Session wird automatisch erstellt, wenn der User den 1. Request absetzt. Daher liefert auch "getSession(false)" genau diese Session zurück.
Was Du willst, ist ja nicht filtern, sondern auf die Login-Seite verlinken, wenn die Session abgelaufen ist.

Daher würde ich das über einen HttpSessionListener "abfrühstücken":

Code:
public void sessionCreated(HttpSessionEvent e) {
   // nichts
}
public void sessionDestroyed(HttpSessionEvent e) {
   request.getRequestDispatcher("/login.jsp").forward(request, response);
}
 
Die Session wird automatisch erstellt, wenn der User den 1. Request absetzt. Daher liefert auch "getSession(false)" genau diese Session zurück.
Was Du willst, ist ja nicht filtern, sondern auf die Login-Seite verlinken, wenn die Session abgelaufen ist.

Daher würde ich das über einen HttpSessionListener "abfrühstücken":

Code:
public void sessionCreated(HttpSessionEvent e) {
   // nichts
}
public void sessionDestroyed(HttpSessionEvent e) {
   request.getRequestDispatcher("/login.jsp").forward(request, response);
}
 
Zuletzt bearbeitet:
Die Session wird automatisch erstellt, wenn der User den 1. Request absetzt. Daher liefert auch "getSession(false)" genau diese Session zurück.

Das heisst, ich muss das so machen, wie oben beschrieben: Beim erfolgreichen Login einen Wert (z.b. login = true) in der Session setzen, wenn dieser Wert nicht gesetzt ist, ist also auch kein User angemeldet, sondern nur eine normale Clientsession vorhanden.

Was Du willst, ist ja nicht filtern, sondern auf die Login-Seite verlinken, wenn die Session abgelaufen ist.
Daher würde ich das über einen HttpSessionListener "abfrühstücken":

Ansich will ich bei jedem Aufruf eines Servlets / einer JSP-Seite checken, ob der Client Zugriff auf diese Resource hat, ohne in jede Seite und jedes Servlet direkt einen Check einzubauen.

Danke für die Antwort, ich schau mir die HttpSessionListener mal an, ob die nicht ähnliches vollbringen können.
 
...da fällt mir noch ein, Du brauchst noch die beiden Objekte, die Du leider im Listener nicht bekommst, da dieser einen parameterlosen Konstruktor besitzen muß - wie dumm. Bleibt Dir daher wirklich nur die Chance über einen Filter:

Code:
public doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   HttpSession session = request.getSession(false); // kommt solange, bis sie abgelaufen ist
   if (session == null) {
      request.getRequestDispatcher("/login.jsp").forward(request, response); // erzeugt ja wieder eine neue Session
   } else {
      chain.doFilter(request, response);
   }
}
 
Danke, es funktioniert jetzt.
Realisiert habe ich es über eine session-scoped Variable, die überprüft wird.
 
Zurück