Wie kann ich eine Thread-sichere JSP-Seite erstellen?

7

Ich möchte eine Thread-sichere JSP-Seite erstellen. Es ist in Servlet möglich, indem Sie die SingleThreadModel-Schnittstelle implementieren, aber ich weiß nicht, wie es in der JSP-Seite funktioniert.

    
vinoth 26.08.2010, 06:59
quelle

6 Antworten

9

Theoretisch können JSP-Seiten über das Direktivitätsattribut isThreadSafe page als threadsafe angezeigt werden. Wenn Sie den Wert false festlegen, wird der Container dazu veranlasst, den Zugriff auf Objekte auf Seitenebene zu synchronisieren (und nicht auf Objekte auf der Sitzungs- und Anwendungsbasis oder auf Objekte anderer Arten). Offensichtlich liegt es immer noch in der Verantwortung des Entwicklers, sicherzustellen, dass der synchrone Zugriff auf unsichere Codebereiche erfolgt.

Außerdem wurde die SingleThreadModel-Schnittstelle in der Servlet Specification-Version 2.4 ebenfalls als veraltet eingestuft. Die SingleThreadModel-Schnittstelle wird verwendet, um die vermeintliche Thread-Sicherheit in JSPs zu implementieren, da die generierten Servlet-Klassen das SingleThreadModel für JSPs implementieren, die das threadsafe-Attribut verwenden. Die Spezifikation selbst erläutert, warum die Schnittstelle veraltet ist:

  

SRV.2.2.1 Hinweis zum Einzelfadenmodell

     

Die Verwendung des SingleThreadModels   Schnittstelle garantiert, dass nur einer   Thread zu einem Zeitpunkt wird in a ausgeführt   Servlet Instanz Service gegeben   Methode. Es ist wichtig sich das zu merken   Diese Garantie gilt nur für jeden   Servlet-Instanz, seit dem Container   kann wählen, solche Objekte zu poolen.   Objekte, die für mehr zugänglich sind   als eine Servlet-Instanz zu einer Zeit,   wie Instanzen von HttpSession, möglicherweise   zu einem bestimmten Zeitpunkt verfügbar sein   mehrere Servlets, einschließlich solcher   das implementieren SingleThreadModel.

     

Es wird empfohlen, dass ein Entwickler   nimm andere Mittel, um diese zu lösen   Probleme, anstatt dies zu implementieren   Schnittstelle, wie die Verwendung zu vermeiden   einer Instanzvariable oder   Synchronisieren des Blocks des Codes   Zugriff auf diese Ressourcen. Das   SingleThreadModel-Schnittstelle ist   in dieser Version der   Spezifikation.

    
Vineet Reynolds 26.08.2010, 07:20
quelle
5

Zuerst die kurze Antwort & lt;% @ page isThreadSafe="false"% & gt;

Die längere Antwort ist, tu das nicht.

Sie müssen hier sehr klar über Ihr Ziel sein. Sie haben ein Servlet nicht threadsicher gemacht, indem Sie ein SingleThreadModel verwenden, sondern Sie haben Dinge eingerichtet, so dass immer nur ein Thread in Ihr Servlet gelangen kann. Vermutlich würden Sie das genau tun, weil der Servlet-Code nicht threadsicher ist, dh wenn mehr als ein Thread an den Code gelangen würde, würden schlimme Dinge passieren.

Das bedeutet für mich, dass Sie so etwas im Servlet-Code haben:

%Vor%

Schließlich kann Ihr servvet-Code selbst nicht Thread-unsicher sein, sicher? Du würdest es reparieren, oder? Also muss es ein Legacy-Code sein, der Thread-unsicher ist?

Wenn in diesem Szenario Ihre JSP diesen vorhandenen Legacy-Code verwenden muss, haben Sie irgendwo in Ihrer JSP einen Anruf, der unsichere Sachen enthält:

%Vor%

Sie müssen also nur diesen unsicheren Anruf schützen:

%Vor%

Wenn Sie zulassen, dass der Großteil Ihrer JSP ordnungsgemäß ausgeführt wird, wird die Leistung viel besser.

Ich sollte auch sagen, dass, wenn Sie Ihre Anwendung als MVC strukturieren, dann alle Thread-unsafe-Code vom Controller aufgerufen wird und die Ansicht (die JSP) niemals unsicher sein muss.

    
djna 26.08.2010 07:15
quelle
3

Durch das Fehlen von Statusinformationen auf Ihrer JSP-Seite . (Keine Instanzvariablen, die sich je nach Anforderung ändern können). Wenn Sie in Ihrer JSP oder Ihrem Servlet keinen Status haben, sind sie threadsafe

    
naikus 26.08.2010 07:15
quelle
1

Über Thread-Sicherheit mit JSP zu sprechen ist falsch - JSP ist eine Ansichtstechnologie und es zeigt nur Ergebnisse an - es führt keine Verarbeitung durch. (it kann verarbeiten, muss aber nicht)

Thread-Sicherheit mit Servlets wird durch no private Felder im Servlet erreicht - die Servlet-Instanz ist eine für den gesamten Container und jede Anfrage ist ein neuer Thread, der die Methode service(..) aufruft.

Sie sollten genau angeben, was Sie in Ihrem Fall mit "thread-safety" meinen - d. h. was erwarten Sie wahrscheinlich nicht.

    
Bozho 26.08.2010 07:10
quelle
1

Verwenden Sie in JSP nur Variablen in Skripts, und Sie können sicher sein, dass sie Thread-sicher sind, da sie in die lokale Variable in service() übersetzt werden.

    
Truong Ha 26.08.2010 09:47
quelle
0

Sie nicht.

JSP ist im Grunde eine einzelne Methode in einem Servlet. Wie Sie vielleicht bereits wissen, sind Methoden threadsicher, da die beiden Threads, die dieselbe Methode desselben Objekts zur gleichen Zeit aufrufen, jede in ihrem eigenen Stack ausführen.

Sie müssen also nicht wirklich eine thread-sichere JSP erstellen, denn es ist bereits handelssicher.

Wenn Sie eine Variable a in einer JSP deklarieren, gibt es keine Möglichkeit, eine andere Anfrage sieht diese Variable.

Was Sie beachten müssen, ist, dass Objekte in die Sitzung eingefügt werden, oder dass mehrere Threads gleichzeitig auf den Kontext zugreifen können, oder gar kein Thread-sicherer Code. Was Sie dann synchronisieren oder erledigen müssen, sind diese Objekte! und nicht die JSP-Seite.

    
OscarRyz 26.08.2010 07:10
quelle

Tags und Links