# Problem mit Session - Übergabe von Kontext zu Kontext



## starr (7. Sep 2008)

Hallo,

ich habe eine Frage bezüglich Session Tracking. Und zwar habe ich eine Hauptanwendung, die die Benutzerverwaltung übernimmt und weitere Anwendungen innerhalb, die durch einen erfolgreichen Login erreicht werden können. Nun habe ich ein Problem mit einer inneren Anwendung, dass die Sessionübergabe nicht funktioniert bzw. die jsessionid verloren geht. Die Hauptanwendung sowie die inneren Applikationen haben einen eigenen Kontext.

Um der Sache auf den Grund zu gehen habe ich mal folgende Methoden ausprobiert:


```
request.isRequestedSessionIdValid() --> false
request.getRequestedSessionId() --> erhalte die jsessionid aus dem cookie
request.isRequestedSessionIdFromCookie() --> true
request.isRequestedSessionIdFromURL() --> false
request.isRequestedSessionIdValid() --> false
```

Komischerweise erkennt er den Cookie und gibt auch die jsessionid zurück. Trotzdem erzeugt die ServletControler Klasse der Unteranwendung eine neue Session.

Hier ein Auszug der ServletControler Klasse die dafür zuständig ist:


```
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
	{
		
		res.setContentType("text/html");
		PrintWriter out = res.getWriter();
		HttpSession session = req.getSession();
	    controlsession = new SessionBean();	
	    setnumPhrasen();
	    
		ServletContext cxt = getServletContext();	
		RequestDispatcher rd = cxt.getRequestDispatcher("/beziehungstypen.jsp");
		int i = 0;

		
		if (session.isNew()) 
		{
            // nach 5 Minuten wird die Session beendet
			session.setMaxInactiveInterval(600);
			session.setAttribute("controlsession", controlsession);
			if(controlsession.setNaechstePhrase())
			{		
				rd.include(req, res);
            }
        }
        else 
        {  
        	controlsession = (SessionBean) session.getAttribute("controlsession");
            
            /*Unterbindet das Reloaden und Zurückspringen der Seite*/
            if(req.getParameter("reload")!=null && Integer.parseInt(req.getParameter("reload"))==(controlsession.getPhrasenNummer() ) )
            {          
            	if ((req.getParameter("submit") != null) && (req.getParameter("submit").equals("Antwort")))       	
            	{   
            		
            		ArrayList antworten=controlsession.getKorrekteAntwort();
            		Iterator iter_antworten = antworten.iterator();
            		for(i=0;i<controlsession.getAnzahlAktuelleEntitiesPaare();i++) 
            		{						
            			String b=(String)iter_antworten.next();
            			controlsession.setAntworten(req.getParameter("answer"+i));
            			if (req.getParameter("answer"+i).equals(b)) 
            			{
            				controlsession.setEntitiesKorrekt(true);
            				controlsession.setNumKorrekteAntwortenEntities(controlsession.getNumKorrekteAntwortenEntities()+1);
            			}
            			else 
            			{
            				controlsession.setEntitiesKorrekt(false);
            			}				
            		}
				
            		if(controlsession.getAnzahlAktuelleEntitiesPaare()==controlsession.getNumKorrekteAntwortenEntities())
            		{
            			controlsession.setLetztePhraseKorrekt(true);
            			controlsession.setNumKorrekteAntworten(controlsession.getNumKorrekteAntworten()+1);
            		}
            		else
            		{
            			controlsession.setLetztePhraseKorrekt(false);
            		}          		
				
            		if(controlsession.getGenutzePhrasen().size() == numPhrasen.intValue() || controlsession.getGenutzePhrasen().size()==controlsession.getAnzahlPhrasenDB()) 
            		{
            			rd = cxt.getRequestDispatcher("/beziehungstypen_end.jsp");
            			rd.include(req, res);                  
            			session.invalidate();
            		}
            		else 
            		{    
            			controlsession.setReloadForm(false);
            			rd = cxt.getRequestDispatcher("/beziehungstypen_check.jsp");
            			rd.include(req, res);       
        				return;
                    
            		}
            	} 
            	
            	else if ((req.getParameter("submit") != null) && (req.getParameter("submit").equals("Weiter"))) 
            	{
            		if(controlsession.setNaechstePhrase())
        			{
        				controlsession.setReloadForm(false);
        				rd.include(req, res);                    
        				return;
        			}
            		else
            		{
            			rd = cxt.getRequestDispatcher("/beziehungstypen_end.jsp");
            			rd.include(req, res);
            			session.invalidate();
            		}
            	}
            	else            		
            	{
            		if(controlsession.getGenutzePhrasen().size() == numPhrasen.intValue() || controlsession.getGenutzePhrasen().size()==controlsession.getAnzahlPhrasenDB()) 
            		{
                	
            			rd = cxt.getRequestDispatcher("/beziehungstypen_end.jsp");
            			rd.include(req, res);
            			session.invalidate();
            		}
            		else 
            		{          	
            			rd.include(req, res);
            		}
            	}
            }
			else
			{
				controlsession.setReloadForm(true);
				rd.include(req, res);
			}
        }
        out.flush();
    }
```

Ich hoffe jemand hat eine Idee. Wenn weitere Informationen notwendig sein sollten liefere ich die gerne nach.

P.s. Das ist nicht mein eigenes Projekt...

Dank im voraus und Grüße
starr


----------



## HLX (10. Sep 2008)

HttpSessions sind immer auf einen ServletContext, also auf eine Anwendung bezogen. Wenn du also die Anwendung wechselst und erstmalig betritts, wird innerhalb dessen ServletContext keine HttpSession zu deiner JSessionId gefunden und somit eine neue Session angelegt. Die Übertragung von Sessionobjekten zwischen Anwendungen macht keinen Sinn, da die Session oft anwendungsspezifische Daten hält, welche von einer anderen Anwendung nicht erkannt werden können.

Die Lösung deines Problems ist die Übertragung aller relevanten Informationen per Requestparameter. In der empfangenden Anwendung müssen die Parameter ausgewertet und an die neu erzeugte Session gebunden werden.


----------



## ralf.zahn (10. Sep 2008)

Oder - falls es zu viele Daten sind, dann in einer Nachricht kapseln und per JMS an die Anwendung schicken...?


----------

