2010-12-30 12 views
0

hatte ich folgendes:Aufrufen Servlet nach JavaScript-Funktion tötet Sitzung

<a href="/servlet/MyServlet" onclick="javascript:CreatePageView();"> Link 1 </a> 

aber ich bemerkte, dass die JavaScript-Funktion CreatePageView() nicht die ganze Zeit ausgeführt werden sollen und war eine Rennsituation zu schaffen. Manchmal wurde das Javascript ausgeführt, andere Male wurde die Weiterleitung zuerst ausgeführt.

Also wollte ich die Reihenfolge der Ereignisse steuern und dachte, das Servlet innerhalb meiner Javascript-Funktion aufzurufen.

Wenn ich mein Servlet aufrufen, wird meine Sitzung zerstört und ich werde auf die Anmeldeseite umgeleitet. Kann jemand erklären, warum das passiert? Oder schlagen Sie vielleicht eine alternative Methode vor, das Servlet aufzurufen, ohne die Sitzung zu beenden? Danke im Voraus.

Antwort

2

Das klingt ähnlich, als ob JavaScript eine asynchrone Anfrage auslöst. Sonst macht das Problem keinen Sinn. Die Aktion des Links wird nur ausgeführt, wenn die JavaScript-Funktion zurückgegeben wurde. Aber wenn Sie eine asynchrone/ajaxische Anfrage in der JS-Funktion auslösen, kann tatsächlich eine Wettlaufsituation auftreten. Es wird nämlich nicht synchron ausgeführt. Es wird "im Hintergrund" ausgeführt.

Sie müssen sicherstellen, dass die Verknüpfung nur aufgerufen wird, wenn die asynchrone Anforderung abgeschlossen ist. Angenommen, Sie tun es in "Plain Vanilla" JS von XMLHttpRequest anstelle einer praktischen Ajaxical JS-Bibliothek wie jQuery, dann müssen Sie den Job in der tun.

Ändern Sie den Link wie folgt:

<a href="/servlets/MyServlet" onclick="return createPageView(this)"> 

(beachten Sie, dass die javascript: pseudoprotocol unnötige ist und dass JS-Funktionen in der Regel mit Klein Start)

und fixieren Sie Ihre JS-Funktion wie folgt (nicht MSIE-kompatibel, beheben Sie das selbst)

function createPageView(link) { 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4) { 
      window.location = link.href; // See? 
     } 
    } 
    xhr.open('GET', 'http://example.com', true); 
    xhr.send(null); 
    return false; // Block link's default action. 
} 

Bei der Frage, warum die Sitzung zerstört wird, wird sie "zerstört", wenn die Anforderungsheader nicht das richtige Sitzungscookie enthalten oder wenn Sie auf der Serverseite session.invalidate() aufrufen oder wenn die Anfrage ausgelöst wurde auf einer anderen Domäne/einem anderen Kontext. Du bist der Einzige, der untersuchen kann, welcher der Täter ist.

+0

Hallo, vielen Dank für die Antwort und die Klärung der Dinge. Ich verstehe alles in Ihrem Codebeispiel mit Ausnahme der letzten drei Zeilen. Würde ich http: // beispiel.com durch meine Servlet-URL ersetzen? – Keefu

+0

Nur die URL, die Sie in Ihrer Funktion asynchron aufgerufen haben. Sie haben nicht den gesamten Inhalt der 'CreatePageView()' Funktion angezeigt, also habe ich nur ein Beispiel gegeben. Oder feuern Sie überhaupt keine asynchrone Anfrage in Ihrer Funktion? – BalusC

+0

Das Problem ist die JavaScript-Funktion, die ich anrufe, ist eine 3rd-Party-Bibliothek für Web-Analysen (Erfassung der Anzahl der Klicks auf einen Link), so bin ich unsicher, ob es eine asynchrone Anfrage auslöst oder nicht. Aufgrund der Rennsituation würde ich mir vorstellen, dass es eine asynch Anfrage ist. Kann ich diese Methode weiterhin verwenden, um die Funktion mit xhr.open() aufzurufen? – Keefu

Verwandte Themen