MVC-Muster
MVC (Model-View-Controller) ist ein weit verbreitetes Software-Designmuster, das zur Vereinfachung des Anwendungsentwicklungsprozesses dient. Durch die Trennung von Datenzugriff, Benutzeroberfläche und Geschäftslogik wird die Struktur der Anwendung klarer.
Komponenten von MVC
1. Modell
- Definition : Stellt die Daten und Geschäftslogik einer Anwendung dar.
- Verantwortlichkeiten :
- Interagieren Sie mit der Datenbank
- Logische Operationen zur Verarbeitung von Daten
- Implementierung in JavaWeb :
- Verwenden Sie die POJO-Klasse (Plain Old Java Object), die normalerweise eins zu eins der Datenbanktabelle entspricht
- DAO (Data Access Object) ist für die Datenbankinteraktion verantwortlich
- Die Serviceschicht implementiert die Geschäftslogik
- Zur Vereinfachung von Datenbankoperationen können ORM-Frameworks (Object-Relational Mapping) wie Hibernate verwendet werden
2. Anzeigen
- Definition : Verantwortlich für die Präsentation von Modelldaten für Benutzer.
- Aufgaben : Daten anzeigen und Benutzeroberfläche bereitstellen.
- Implementierung in JavaWeb :
- Häufig verwendete JSP (JavaServer Pages)
- Sie können auch moderne Template-Engines wie Thymeleaf verwenden
3. Controller
- Definition : Benutzeranfragen bearbeiten und Modelle und Ansichten koordinieren.
- Verantwortlichkeiten :
- Benutzereingaben empfangen
- Rufen Sie die Geschäftslogik des Modells auf
- Ansicht aktualisieren
- Implementierung in JavaWeb :
- Servlets auf traditionelle Weise verwenden
- Verwendung von @Controller-annotierten Klassen im Spring-Framework
Integrierte JSP-Objekte
JSP bietet mehrere integrierte Objekte, die den Webentwicklungsprozess erheblich vereinfachen. Im Folgenden finden Sie eine Übersicht über die wichtigsten integrierten Objekte:
- Anfrage (HttpServletRequest)
- Übergeben Sie die vom Client gesendete Anfrage an den Server
- Enthält Parameter, URL, Header-Informationen usw.
- Antwort (HttpServletResponse)
- Enthält die vom Server an den Client gesendete Antwort
- Es können Antwortheader, Statuscodes usw. festgelegt werden
- Seitenkontext (PageContext)
- Bietet Zugriff auf andere integrierte Objekte
- Enthält seitenweite Methoden wie das Abrufen, Festlegen und Löschen von Eigenschaften
- Sitzung (HttpSession)
- Statusinformationen während einer Sitzung speichern
- Anwendung (ServletContext)
- Teilen Sie Daten anwendungsweit
- raus (JspWriter)
- Senden Sie HTML-Inhalte an den Kunden
- Konfiguration (ServletConfig)
- Enthält Parameter zum Initialisieren des Servlets
- Seite (Objekt)
- Stellt das aktuelle Servlet-Objekt dar
- Ausnahme (auslösbar)
- Wird nur in Fehlerseiten verwendet (isErrorPage=true)
- Enthält Ausnahmeinformationen
Diese integrierten Objekte erleichtern die Verarbeitung von HTTP-Anfragen erheblich. Zum Beispiel:
- Wird verwendet,
request
um den Anforderungsinhalt des Benutzers abzurufen session
Rufen Sie Informationen zum Sitzungsstatus ab mitout
Senden Sie HTML an den Client mit
JSP- und Servlet-Vergleich
JSP (JavaServer Pages) und Servlet sind häufig verwendete Technologien in der JavaWeb-Entwicklung, die hauptsächlich zur Generierung dynamischer Webinhalte verwendet werden. Obwohl ihre Ziele ähnlich sind, gibt es offensichtliche Unterschiede in der Art und Weise, wie sie verwendet werden, und in den anwendbaren Szenarien.
1. Syntax und Benutzerfreundlichkeit
JSP
- Basiert auf HTML und ermöglicht die Einbettung von Java-Code in HTML
- Die Unterstützung für Expression Language (EL) und JSTL vereinfacht den Datenzugriff und allgemeine Vorgänge
- Besser geeignet zum Generieren und Anzeigen von Ansichten (View)
Servlet
- Reiner Java-Code
- Relativ umständlich beim Generieren von HTML
- Eher geeignet für den Umgang mit komplexer Geschäftslogik
2. Kompilierungsmethode
JSP
- Auf erste Anfrage kompilieren
- Nach Codeänderungen automatisch neu kompilieren, kein Neustart des Servers erforderlich
Servlet
- Wird beim Serverstart oder bei der ersten Anfrage kompiliert
- Nach dem Kompilieren ist kein erneutes Kompilieren erforderlich.
3. Hauptzweck
JSP
- Ansichten (HTML-Seiten) generieren und anzeigen
- Geeignet für die Handhabung einfacher Anzeigelogik
Servlet
- Behandeln Sie die Geschäftslogik
- Behandeln Sie Back-End-Vorgänge wie Formularübermittlung und Datenbankabfragen
4. Anwendung im MVC-Muster
In der tatsächlichen Entwicklung werden JSP und Servlet normalerweise zusammen verwendet, um das MVC-Entwurfsmuster (Model-View-Controller) zu implementieren:
- Controller : Servlet verarbeitet Benutzeranforderungen und führt Geschäftslogik aus
- Modell : POJO-Implementierung (Plain Old Java Object) zum Speichern von Daten auf Anwendungsebene
- Ansicht : JSP zeigt Benutzern Daten an
Diese Kombination bringt die Vorteile beider optimal zur Geltung und verbessert die Wartbarkeit und Skalierbarkeit des Codes.
Sitzungs- und Cookie-Vergleich
Sitzungen und Cookies sind beide wichtige Webtechnologien zum Speichern von Benutzerinformationen, unterscheiden sich jedoch in mehreren Punkten erheblich.
1. Speicherort
- Sitzung : Auf der Serverseite gespeichert, jeder Benutzer hat eine eindeutige Sitzung.
- Cookie : Wird auf dem Client (Browser) gespeichert und über den HTTP-Antwortheader festgelegt.
2. Speicherkapazität
- Cookie : Kleine Kapazität, normalerweise nicht mehr als 4 KB.
- Sitzung : Theoretisch gibt es keine Begrenzung, aber zu viele belegen möglicherweise viel Serverspeicher.
3. Datentyp
- Cookie : Kann nur Zeichenfolgen speichern, Sonderzeichen müssen codiert werden.
- Sitzung : Kann jeden Datentyp speichern (z. B. Zeichenfolgen, Zahlen, Objekte usw.).
4. Lebenszyklus
- Kekse :
- Es kann eine klare Ablaufzeit eingestellt werden.
- Wenn keine Ablaufzeiteinstellung vorhanden ist, ist sie nur in der aktuellen Browsersitzung gültig.
- Sitzung :
- Wird vom Server gesteuert, normalerweise mit einer festgelegten Ablaufzeit.
- Der Server wird möglicherweise automatisch gelöscht, wenn der Benutzer über einen längeren Zeitraum inaktiv ist.
5. Sicherheit
- Cookie : wird auf der Client-Seite gespeichert, hat eine geringe Sicherheit und kann gestohlen oder verändert werden.
- Sitzung : Auf dem Server gespeichert, Benutzer können nicht direkt darauf zugreifen und die Sicherheit ist hoch.
6. Anwendungsszenarien
- Cookie : Geeignet zur Speicherung kleiner Datenmengen mit geringen Sicherheitsanforderungen.
- Sitzung : Geeignet für die Speicherung großer Datenmengen mit hohen Sicherheitsanforderungen.
7. Auswirkungen auf die Leistung
- Cookie : Wird in jeder HTTP-Anfrage mitgeführt und kann die Effizienz der Netzwerkübertragung beeinträchtigen.
- Sitzung : Beeinträchtigt die Netzwerkübertragung nicht, kann jedoch die Serverlast erhöhen.
Wählen Sie Vorschläge aus
- Sie müssen große Datenmengen speichern und haben hohe Sicherheitsanforderungen: Verwenden Sie Session.
- Es müssen nur geringe Datenmengen gespeichert werden und die Sicherheitsanforderungen sind nicht hoch: Verwenden Sie Cookies.
- Ziehen Sie in Betracht, sie in Kombination zu verwenden: Cookie speichert die Sitzungs-ID und Sitzung speichert bestimmte Daten.
Single Sign-On: Lösungen, wenn Cookies deaktiviert sind
Single Sign-On (SSO) ist eine Methode, die es Benutzern ermöglicht, über eine Authentifizierung auf mehrere verwandte Systeme oder Dienste zuzugreifen. Traditionell stützte sich SSO auf Cookies, um den Sitzungsstatus des Benutzers zu verfolgen. Wenn Cookies jedoch deaktiviert werden, müssen wir Alternativen einführen. Hier sind mehrere mögliche Lösungen, jede mit ihren eigenen Vor- und Nachteilen:
1. URL-Umschreibung
Prinzip: Hängen Sie die Sitzungskennung (z. B. SessionID) an die URL an.
Vorteil:
- Einfach und leicht umzusetzen
- Verlässt sich nicht auf clientseitigen Speicher
Mangel:
- Sicherheitsrisiko: SessionID kann abgefangen oder durchgesickert werden
- URLs werden lang und unansehnlich
- Kann SEO beeinträchtigen
Einsatzszenario: Geeignet für interne Systeme mit geringen Sicherheitsanforderungen
2. Formularfelder ausblenden
Prinzip: Fügen Sie dem HTML-Formular versteckte Felder hinzu, um Sitzungsinformationen zu speichern.
Vorteil:
- Relativ sicher und nicht direkt in der URL sichtbar
- Einfach umzusetzen
Mangel:
- Gilt nur für formularbasierte Interaktionen
- Nicht-Formularanfragen (z. B. AJAX) können nicht verarbeitet werden.
Nutzungsszenario: Geeignet für herkömmliche formularbasierte Webanwendungen
3. Webspeicher (localStorage/sessionStorage)
Prinzip: Verwenden Sie die Web Storage API von HTML5, um Sitzungsinformationen auf dem Client zu speichern.
Vorteil:
- Datenpersistenz (localStorage) oder Sitzungspersistenz (sessionStorage)
- Größere Speicherkapazität
- Wird bei HTTP-Anfrage nicht automatisch gesendet, die Datenübertragung kann gesteuert werden
Mangel:
- Erfordert JavaScript-Unterstützung
- Mögliche XSS-Sicherheitsrisiken
Einsatzszenarien: geeignet für moderne Webanwendungen, insbesondere Single Page Applications (SPA)
4. Tokenbasierte Authentifizierung (z. B. JWT)
Prinzip: Der Server generiert ein Token mit Benutzeridentitätsinformationen, und der Client speichert das Token und fügt es in jede Anfrage ein.
Vorteil:
- Staatenlos, einfach zu erweitern
- Gute domänenübergreifende Unterstützung
- Kann umfangreiche Benutzerinformationen enthalten
- Hohe Sicherheit (bei korrekter Implementierung)
Mangel:
- Die Umsetzung ist relativ komplex
- Die Tokenverwaltung (z. B. Aktualisieren, Widerrufen) erfordert zusätzliche Überlegungen
Einsatzszenarien: Geeignet für moderne Webanwendungen und APIs, die hohe Sicherheit und Skalierbarkeit erfordern
Wählen Sie Vorschläge aus
- Vermeiden Sie bei Anwendungen mit hohen Sicherheitsanforderungen die Verwendung von URL-Rewriting
- Wenn es sich um eine moderne Anwendung auf HTML5-Basis handelt, geben Sie Web Storage oder einem tokenbasierten Ansatz Vorrang
- Für Systeme, die ein hohes Maß an Sicherheit und Skalierbarkeit erfordern, empfehlen sich tokenbasierte Authentifizierungsmethoden wie JWT.
- Kombinieren Sie nach Möglichkeit Methoden, um Kompatibilität und Sicherheit zu verbessern
Denken Sie daran: Egal für welche Methode Sie sich entscheiden, achten Sie bei der Implementierung auf die Sicherheit und befolgen Sie die Best Practices.
Löschen einer Sitzung in der Webanwendung
In Webanwendungen können Sitzungen aufgrund der folgenden Faktoren gelöscht werden:
1. Sitzungszeitüberschreitung
Die meisten Frameworks erlauben das Festlegen von Timeouts. Wenn eine bestimmte Sitzung in dieser Zeit nicht auf den Server zugreift, wird sie automatisch gelöscht.
- Beispiel : In Java Servlet kann das Timeout über die Konfigurationsdatei festgelegt werden
web.xml
.<session-config>
2. Manuelles Löschen
Anwendungscode kann Sitzungen explizit löschen.
- Beispiel : In Java Servlet können Sie
HttpSession.invalidate()
eine Methode zum Löschen einer Sitzung verwenden.
3. Serverneustart
- Standard : Beim Neustart des Servers werden alle In-Memory-Sitzungen gelöscht.
- Ausnahme : Einige Server können Sitzungen auf der Festplatte beibehalten und nach Neustarts wiederherstellen.
4. Schließen Sie den Browser
- Bei Cookie-basierten Sitzungen (die häufigste Implementierung) wird das Sitzungscookie normalerweise gelöscht, wenn der Browser geschlossen wird.
- Dadurch wird die Sitzung auf der Serverseite nicht sofort gelöscht, es sei denn, ein Sitzungszeitlimit wird festgelegt oder der Server ergreift Maßnahmen.
5. Serverspezifisches Verhalten
Die Sitzungsverwaltung wird vom Webserver übernommen und kann je nach Server unterschiedlich sein:
- Einige Server führen regelmäßig Zeitüberschreitungsprüfungen durch und löschen abgelaufene Sitzungen.
- Andere Server prüfen möglicherweise, ob beim Empfang von Anfragen eine Sitzungszeitüberschreitung vorliegt.
Best Practices
- Legen Sie geeignete Zeitüberschreitungen basierend auf den Sicherheitsanforderungen Ihrer Anwendung fest.
- Implementieren Sie die manuelle Abmeldefunktion, damit der Benutzer die Sitzung nach Abschluss des Vorgangs aktiv deaktivieren kann.
- Erwägen Sie die Verwendung sicherer HTTPOnly-Cookies zum Speichern von Sitzungs-IDs für mehr Sicherheit.
- Machen Sie sich mit der Sitzungsverwaltungsrichtlinie für den spezifischen Server vertraut, den Sie verwenden.
Hinweis: Das spezifische Verhalten kann je nach Webserver, Anwendungsframework und Konfigurationseinstellungen variieren.
Der Prozess der Erstellung einer Servlet-Instanz in Tomcat
Als Webcontainer, der die Servlet-Spezifikation implementiert, ist Tomcat für die Erstellung und Verwaltung des Lebenszyklus von Servlet-Objekten verantwortlich. Im Folgenden wird der detaillierte Prozess zum Erstellen und Verwalten von Servlet-Instanzen in Tomcat beschrieben:
1. Laden Sie die Servlet-Klasse
Wenn Tomcat eine Anfrage erhält und eine bestimmte Servlet-Klasse erstellen muss:
- Rufen Sie den Klassenlader (ClassLoader) auf, um die angegebene Klasse zu laden
- Wenn die Klasse bereits geladen ist, überspringen Sie diesen Schritt
2. Instanziieren Sie die Servlet-Klasse
- Tomcat verwendet den Java-Reflexionsmechanismus,
Class.newInstance()
um eine Servlet-Instanz zu erstellen - Diese Methode ruft den parameterlosen Konstruktor der Servlet-Klasse auf
- Hinweis: Wenn die Klasse keinen parameterlosen Konstruktor hat oder auf den Konstruktor nicht zugegriffen werden kann (z. B. privat), wird eine Ausnahme ausgelöst
3. Initialisieren Sie das Servlet-Objekt
- Tomcat ruft
init(ServletConfig config)
die Methode der Servlet-Instanz auf - Übergeben Sie
ServletConfig
das Objekt, einschließlich der Initialisierungsparameter - Dieser Schritt ermöglicht es dem Servlet, alle erforderlichen Einrichtungsvorgänge durchzuführen
4. Verarbeiten Sie die Anfrage (rufen Sie die Servicemethode auf)
- Nachdem die Initialisierung abgeschlossen ist, ruft Tomcat die Servlet
service()
-Methode auf, um die Anfrage zu verarbeiten. service()
Methoden erhalten normalerweise zwei Parameter:HttpServletRequest
Beispiel: Stellt eine Clientanfrage darHttpServletResponse
Beispiel: Zeigt eine Serverantwort an
5. Servlet-Lebenszyklusmanagement
- Servlet-Instanzen sind normalerweise Singletons und es wird nur eine Instanz jeder Servlet-Klasse erstellt.
- In einer Multithread-Umgebung wird jede Client-Anfrage von einem separaten Thread bearbeitet
- Entwickler müssen die Thread-Sicherheit von Servlets gewährleisten
6. Servlet-Zerstörung
- Wenn das Servlet nicht mehr benötigt wird oder der Server heruntergefahren wird, ruft Tomcat die
destroy()
Methode des Servlets auf - Diese Methode wird verwendet, um Ressourcen freizugeben und Bereinigungsvorgänge durchzuführen
Dinge zu beachten
- Reflexionsmechanismus :
newInstance()
Methoden sind Teil der Java-Reflexions-API und ermöglichen die dynamische Erstellung von Objekten zur Laufzeit - Thread-Sicherheit : Da Servlet ein Singleton ist, muss den Thread-Sicherheitsproblemen in einer Multithread-Umgebung besondere Aufmerksamkeit gewidmet werden.
- Leistungsüberlegungen : Die Singleton-Funktion von Servlet trägt zur Verbesserung der Leistung bei, bringt jedoch auch Herausforderungen bei der Thread-Sicherheit mit sich.
- Fehlerbehandlung : Während des gesamten Prozesses muss Tomcat mögliche Ausnahmen wie Klassenladefehler, Instanziierungsfehler usw. ordnungsgemäß behandeln.
Durch diesen Prozess kann Tomcat den Lebenszyklus von Servlet flexibel verwalten und die Kernfunktionen des Servlet-Containers realisieren.
SQL-Injection-Angriffe und ihre Präventionsmaßnahmen
SQL-Injection ist eine häufige und gefährliche Form von Netzwerkangriffen. Angreifer versuchen, Datenbankabfragen zu manipulieren, indem sie bösartigen SQL-Code in Benutzereingaben einfügen, um an vertrauliche Informationen zu gelangen oder Daten zu manipulieren. Um SQL-Injection-Angriffe effektiv zu verhindern, können folgende Schlüsselmaßnahmen ergriffen werden:
- Verwenden Sie vorbereitete Anweisungen
- Prinzip: Bestimmen Sie vor der Ausführung der SQL-Anweisung die Abfragestruktur und übergeben Sie anschließend die Parameter.
- Vorteile: Parameter werden nicht als SQL-Codes interpretiert, wodurch eine Injektion wirksam verhindert wird.
- Implementierung: wie in Java mittels
PreparedStatement
Klassen.
- Verwenden Sie parametrisierte Abfragen
- Stellt ähnlich wie vorbereitete Anweisungen sicher, dass Benutzereingaben als Daten und nicht als Code behandelt werden.
- Anwendbar auf verschiedene Programmiersprachen und Datenbanksysteme.
- Strenge Benutzereingabevalidierung
- Filtern und validieren Sie alle Benutzereingaben.
- Beispiel: Beschränken Sie Benutzernamen auf Buchstaben und Zahlen.
- Lehnen Sie potenziell gefährliche Charaktere ab oder entkommen Sie ihnen.
- Implementieren Sie das Prinzip der geringsten Privilegien
- Kontrollieren Sie die Datenbankzugriffsberechtigungen streng.
- Erteilen Sie Benutzern nur die Mindestberechtigungen, die zum Ausführen der erforderlichen Vorgänge erforderlich sind.
- Selbst wenn eine Injektion erfolgt, kann der potenzielle Schaden begrenzt werden.
Durch die gemeinsame Anwendung dieser Methoden kann das Risiko von SQL-Injection-Angriffen deutlich reduziert werden. Es ist zu beachten, dass Sicherheitsmaßnahmen mehrschichtig sein sollten und sich nicht ausschließlich auf eine einzige Verteidigungsmethode stützen sollten. Kontinuierliches Sicherheitsbewusstsein und regelmäßige Codeüberprüfungen sind ebenso wichtig, um potenzielle Schwachstellen rechtzeitig zu erkennen und zu beheben.
Einführung in XSS-Angriff und -Verteidigung
XSS-Angriff
XSS (Cross-Site-Scripting) ist eine Angriffsmethode, die schädliche Skripte in Webseiten einschleust, damit diese Skripte auf den Browsern anderer Benutzer ausgeführt werden können. Wenn ein Benutzer eine Webseite besucht, die bösartige Skripte enthält, werden diese Skripte im Browser des Benutzers ausgeführt, um bösartige Vorgänge auszuführen, wie zum Beispiel:
- Holen Sie sich Benutzerinformationen
- Manipulation von Webinhalten
- Führen Sie nicht autorisierte Aktionen durch
Möglichkeiten, XSS zu verhindern
- Benutzereingaben entkommen : Entkommen Sie alle vom Benutzer bereitgestellten Daten, um sicherzustellen, dass sie vom Browser als einfacher Text analysiert und nicht als Skript ausgeführt werden.
- Content Security Policy (CSP) : CSP ist ein Browser-Sicherheitsmechanismus, der die Ausführung und das Laden von Browserressourcen wirksam einschränken kann. Beispielsweise kann die Beschränkung von Webseiten auf das Ausführen und Laden von Skripts nur von demselben Domänennamen XSS effektiv verhindern.
- Eingabeüberprüfung : Überprüfen Sie die vom Benutzer übermittelten Informationen und verweigern Sie deren Verarbeitung, wenn festgestellt wird, dass sie Inhalte enthalten, die eine XSS-Injection verursachen können.
- Nur HTTP-Cookies verwenden : Verwenden Sie das Nur-HTTP-Flag, um Cookies mit vertraulichen Informationen zu ändern und zu verhindern, dass der Cookie-Inhalt von JavaScript abgerufen oder geändert wird.
- Vermeiden Sie die Verwendung von unsicherem JS-Code : Einige JS-Methoden (z. B. innerHTML) bergen Sicherheitsrisiken und sollten so weit wie möglich vermieden werden.
Um sich effektiv gegen XSS-Angriffe zu verteidigen, ist es am besten, eine Kombination der oben genannten Methoden zu verwenden, um einen mehrschichtigen Abwehrmechanismus aufzubauen. Regelmäßige Sicherheitsaudits und Updates sind ebenfalls wichtige Maßnahmen, um die Sicherheit Ihrer Website zu gewährleisten.
CSRF
CSRF (Cross-site Request Forgery) ist ein Netzwerksicherheitsangriff, der die authentifizierte Identität eines Benutzers auf einer vertrauenswürdigen Website ausnutzt, um nicht autorisierte Aktionen durchzuführen. Der Angriffsprozess ist wie folgt:
- Der Angreifer erstellt eine schädliche Website oder einen schädlichen Link.
- Den Zielbenutzer dazu verleiten, auf den Link zu klicken oder eine bösartige Website zu besuchen.
- Wenn der Benutzer derzeit auf der Zielwebsite angemeldet ist, werden seine/ihre Identitätsauthentifizierungsinformationen (z. B. Cookies) automatisch mit der Anfrage gesendet.
- Der Angreifer nutzt diese Authentifizierungsinformationen, um als Benutzer gefälschte Anfragen an die Zielwebsite zu senden.
- Die Zielwebsite kann nicht erkennen, ob diese Anfragen von echten Benutzern initiiert werden und somit nicht autorisierte Vorgänge ausführen.
Die Gefahr eines CSRF-Angriffs besteht darin, dass er die Identitätsauthentifizierung umgehen und ohne Wissen des Benutzers verschiedene Vorgänge ausführen kann, z. B. Kontoinformationen ändern, Transaktionen durchführen usw. Um CSRF-Angriffe zu verhindern, müssen Websites zusätzliche Sicherheitsmaßnahmen implementieren, z. B. die Verwendung von Anti-CSRF-Tokens, die Überprüfung von Referrer-Headern usw.