Methoden SessionID global

ThomasH.

Mitglied
Hallo zusammen,

bin hier neu im Forum angekommen und freue mich, euer Wissen zu lesen. :)
Noch bin ich Anfänger, aber das bekommen wir schon hin.

Folgendes. Ich möchte eine SessionID erstellen, um gewisse Vorgänge im JavaProgramm auseinanderhalten zu können.
Dazu habe ich in einer Hauptklasse einen Generator:
Ausschnitt der Klasse MasterDataBlackboard:
Java:
    public static String GenerateSession( final String sessionID ) {
        return System.currentTimeMillis() / 1000 + "_" + Math.round( Math.random() * 1000 );
    }

Aufruf der Methode in einer anderen Klasse:
Java:
public String SessionID;
    public void reset() throws Exception {
        SessionID = MasterdataBlackboard.GenerateSession( SessionID );
    }

Funktioniert ja auch. Allerdings wird - wie erwartet - die SessionID für jeden Aufruf in einer anderen Klasse neu erzeugt, was nicht so sein soll.

Daher jetzt mal meine Frage, was habe ich zu ändern, damit wirklich nur eine SessionID erzeugt wird und ich diese eine ID überall verwenden kann?

Danke für die Hilfe bei meinem primitiven Problem!:eek:
 
Zuletzt bearbeitet:

Final_Striker

Top Contributor
Wofür übergibst du die SessionID? Du machst doch eh nichts damit.
Java:
public static String GenerateSession() {
   return System.currentTimeMillis() / 1000 + "_" + Math.round( Math.random() * 1000 );
}

Daher jetzt mal meine Frage, was habe ich zu ändern, damit wirklich nur eine SessionID erzeugt wird und ich diese eine ID überall verwenden kann?

Schon mal was von dem Schlüsselwort static gehört. ;-)
 
S

SlaterB

Gast
einfach so static hilft auch nicht, dann kann man ja gleich nur eine Id "1" irgendwo ablegen und braucht nie eine neue erzeugen,

wie lautet das Konzept? welche Klassen sind alle beteiligt, wie lange brauchen diese zusammen dieselbe Id, wann warum nicht mehr,
welche Ereignisse treten als Grund auf usw? 'Vorgänge' wurde genannt, sind das bisher nur lose Methodenaufrufe
oder gibt es schon gemeinsame Daten wie die Session bzw. Request bzw. Transaction/ Connection im Web-/DB-Umfeld?

wenn jeder Vorgang von einem eigenen Thread kontrolliert wird, dann könnte dieser Thread die Id verwalten,
entweder in einem normalen Objekt welches dieser umherschleppt (z.B. eigene Thread-Klasse)
oder auch mit dem ThreadLocal-Konzept
 

ThomasH.

Mitglied
Hallo Striker,

Danke für deine Antwort.
Sicher kenne ich das Static Argument. Ich hatte oben noch den Erstbeitrag editiert.
Allerdings scheint das nicht zu helfen, die String-Variable wird beim Aufruf der Methode aus einer anderen Klasse trotzdem neu erzeugt?! Verstehe momentan nicht, weshalb.
 
S

SlaterB

Gast
siehe auch meine Antwort

> Verstehe momentan nicht, weshalb.
weshalb nicht?! von selber passiert nix, du kannst noch abfragen ob der übergebene Parameter != null ist,
aber das würde nur bei einem Aufrufer helfen und dann ist sowieso schon fraglich, warum der zweimal eine SessionId anfordert

edit:
zumal reset() auch eher danach klingt als soll auf jeden Fall eine neue Id kommen,
dass mehrere reset()-Aufrufe in unterschiedlichen Klassen auf wundersameweise von selber so agieren, wie du es brauchst,
das gibt es nur in Märchen, oder mit durchdachter Programmierung
 

ThomasH.

Mitglied
einfach so static hilft auch nicht, dann kann man ja gleich nur eine Id "1" irgendwo ablegen und braucht nie eine neue erzeugen,

wie lautet das Konzept? welche Klassen sind alle beteiligt, wie lange brauchen diese zusammen dieselbe Id, wann warum nicht mehr,
welche Ereignisse treten als Grund auf usw? 'Vorgänge' wurde genannt, sind das bisher nur lose Methodenaufrufe
oder gibt es schon gemeinsame Daten wie die Session bzw. Request bzw. Transaction/ Connection im Web-/DB-Umfeld?

wenn jeder Vorgang von einem eigenen Thread kontrolliert wird, dann könnte dieser Thread die Id verwalten,
entweder in einem normalen Objekt welches dieser umherschleppt (z.B. eigene Thread-Klasse)
oder auch mit dem ThreadLocal-Konzept

Die ID soll zuerst initialisiert werden und über die losen Aufrufe von allen Methoden bis zum Ende bestehen.
Ich programmiere momentan ein paar Akzeptanztests mit Datenbank, die mehrere Benutzer aufrufen können. Die Session soll nur verhindern, dass sich die Tests bei mehreren Benutzern überkreuzen.

Die Session in einen eigenen Thread zu packen wäre ein guter Ansatz! Falls es jetzt keinen all zu großen Umstand macht, ist es möglich es im Grundschema hier aufzuzeigen?
 

ThomasH.

Mitglied
Spricht denn überhaupt etwas dagegen Get- und Set-Methoden zu verwenden?
Java:
    public String SessionID;

    public void SetSessionID() {
        SessionID = System.currentTimeMillis() / 1000 + "_" + Math.round( Math.random() * 1000 );
    }

    public String GetSessionID() {
        return SessionID;
    }
Und dann für jeden losen Aufruf GetSessionID() zu verwenden, um sie mir zu holen?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
Methoden und Variablen immer klein schreiben!

der Code wie er dort steht kann für sich Sinn machen oder auch nicht, hängt von den weiteren Umständen ab,
z.B. ob die angedeuteten 'mehreren Klassen' alle bei einer zentralen Stelle nachfragen (dann wäre der Code gut)
oder alle selber die Id verwalten (dann wäre der Code kopiert in mehrere Klassen schlecht)
 
G

Gonzo17

Gast
Hab auch noch nen Vorschlag und würde gerne wissen wie relevant/sinnvoll der in dem Fall wäre.

Die Methode
Code:
getSessionID()
könnte man so modifizieren:

Java:
public String getSessionID() {
	if(sessionID==null){
		setSessionID();
	}
	return sessionID;
}

Und wenn man gleichzeitig nicht will, dass die
Code:
sessionID
von "jedem" beliebig neu gesetzt werden darf, dann könnte man die Methode
Code:
setSessionID()
noch auf
Code:
private
setzen.
 

Neue Themen


Oben