2016-10-06 2 views
0

Der Fehler, den ich bekommen, ist dies:Sitzung ist keine Struktur?

Element USER is undefined in a Java object of type class [Ljava.lang.String;

Die Codezeilen ich diese Fehlermeldung erhalten, wenn ich so etwas tun:

SESSION.user.functionName()

Es ist zufällig und ich gehe davon geschieht nachdem die Benutzersitzung abgelaufen ist. Mein Problem ist vor allem, ist der SESSION Umfang immer eine Struktur? Wie/Warum hält ColdFusion es für eine Zeichenfolge?

Egal, mein Hauptproblem ist, dass ich CFWheels verwende. Alle meine Controller erweitern natürlich den Haupt-Controller.cfc und alle meine Controller (außer dem öffentlichen) filtern durch eine checkLogin Funktion. Diese Funktion hat dies darin:

<cfif !structKeyExists(session, "user")> 
    <cfif !structKeyExists(params,'layout') || params.layout EQ true> 
       <cfset redirectTo(route="home",error="You must be logged in to continue.") /> 
    <cfelse> 
     <cfset flashInsert(error="You session has expired and you must login to continue. <a href=''>Reload the Page</a> to login.") /> 
     <cfset redirectTo(controller="Shared",action="ajaxError") /> 
    </cfif> 
</cfif> 

In diesem Teil der Funktion, überprüfe ich ausdrücklich, wenn user im session existiert und wenn es nicht eine Art und Weise tut oder das andere ich sie woanders zu senden. Wie in aller Welt kommt der Code über diesen Teil hinaus, um dann zu versagen, wenn die session irgendwie eine Zeichenkette ist?

Nicht zu erwähnen gibt es verschiedene andere Orte, bevor ich auf die Fehlerlinie komme, wo ich sicherstelle, dass verschiedene Dinge im SESSION.user Objekt korrekt sind.

+0

(Bearbeiten) Die Fehlermeldung besagt, dass das 'user' -Element String ist - nicht' session'. Erteilte Fehlermeldungen sind nicht immer 100% genau. Es kann auch bedeuten, dass der Schlüssel gar nicht existiert. Sie erhalten den gleichen Fehler von 'session.someKeyThatDoesNotExist.functionName()' – Leigh

+0

Ist es nicht zu sagen, 'user' ist undefined im Objekt. Das Objekt ist die Klasse von String? – Leeish

+0

Wenn Sie Recht haben, wenn ich '' in ' '. Dennoch macht es keinen Sinn, wie es andere Teile meines Codes übergangen haben könnte, indem ich Methoden im Benutzerobjekt benutzt habe, nur um zur Ansicht zu gelangen und dann fehlzuschlagen, oder? – Leeish

Antwort

0

Was geschah, war auf Ajax-Anfragen. Einige Ajax fordert Ladeberichte und solche, die einige Sekunden dauern können, abzufragen, besonders bevor einige Zwischenspeicherung stattfindet. Wenn ein Benutzer einen Ajax-Aufruf ausführt und sich dann abmeldet, könnte die Anforderung technisch alle meine Berechtigungsprüfungen durchlaufen, um zum Controller zu gelangen (es dauert nur Millisekunden), aber in der Steuerung wird der Benutzer beim Abrufen von Daten von den Modellen abgemeldet.

Wenn die Ansicht zum Laden bereit ist, wird die Sitzung gelöscht. Wenn ich dort etwas aus dem Session-Bereich verwende, wird es fehlerhaft.

Ich denke, ich werde das beheben, indem Sie einen Filter hinzufügen, der nach der Controller-Aktion ausgeführt wird, um zu überprüfen, ob der Sitzungsumfang noch vorhanden ist. Wenn nicht, werde ich die Anfrage einfach abbrechen. Ich habe keine Modelllogik in irgendeiner meiner Ansichten, aber ich referenziere manchmal Methoden im Bereich SESSION.user. Wahrscheinlich nicht puristisch MVC.

In den Fällen, in denen die Abmeldung stattfindet, bevor Teile des Controllers fertig sind, lasse ich diese Fehler einfach passieren und ignoriere sie, weil ich weiß, dass der Benutzer das nicht wirklich sieht.

+0

Grrr ... Es würde erscheinen, die After-Filter laufen, nachdem die Ansicht läuft. Nicht sicher, wie man das fängt. – Leeish

+0

Noch ein weiterer Grund, die Verwendung von Sitzungsvariablen zu minimieren. –

+0

Sie können Ihren Code so einrichten, dass er nach dem Ende der Sitzung in der Datei ../wheels/events/onsessionend.cfm ausgeführt wird. Dadurch wird der Code ausgeführt, wenn die Sitzung beendet wird. Alle Werte im Sitzungsumfang sind dort im Argumentbereich verfügbar. –

Verwandte Themen