Heim > Backend-Entwicklung > Golang > Der statische Golang-Dienst ist ausgeblendet

Der statische Golang-Dienst ist ausgeblendet

WBOY
Freigeben: 2023-05-10 15:41:37
Original
681 Leute haben es durchsucht

Wenn wir die Go-Sprache zum Entwickeln von Projekten oder Diensten verwenden, müssen wir manchmal statische Dateien oder Ressourcen im Projekt bereitstellen, z. B. Stylesheets, Bilder, HTML-Dateien usw. Obwohl wir diese Ressourcen bereitstellen, möchten wir diese Dateien jedoch nicht dem öffentlichen Netzwerk zugänglich machen, da dies zu Sicherheitsproblemen führen kann. In diesem Artikel erfahren Sie, wie Sie mithilfe der Go-Sprache statische Dateien oder Ressourcen bereitstellen und diese ausblenden können.

Traditionelle Methode

Bei der traditionellen Methode können wir statische Dateien oder Ressourcen bereitstellen, indem wir die Pfade statischer Dateien oder Ressourcen im Programm lesen und diese Pfade an den Browser senden. Dieser Prozess umfasst häufig die folgenden Schritte:

  1. Erstellen Sie einen Routenprozessor.
  2. Parsen Sie den Anforderungspfad und ordnen Sie ihn einem lokalen Dateipfad zu.
  3. Wenn die Datei vorhanden ist, öffnen Sie sie und senden Sie sie an den Browser.
  4. Wenn die Datei nicht existiert, wird ein 404-Fehlercode zurückgegeben.

Der Nachteil dieser Methode besteht darin, dass der vollständige Dateipfad beim Zugriff auf die Datei in der Adressleiste des Browsers angezeigt wird. Diese Sicherheitslücke kann zu Schwachstellen führen, da Angreifer vom Browser Pfadinformationen erhalten können, um Angriffe zu starten.

Dateien ausblenden

Um das Dateiverzeichnis auszublenden, können wir die FileServer-Funktion im integrierten Net/http-Paket der Go-Sprache verwenden. Die FileServer-Funktion kann auf das lokale Dateisystemverzeichnis zugreifen und den Dateiinhalt zurückgeben und verarbeitet außerdem automatisch HTTP-Anfragen usw. Um die FileServer-Funktion verwenden zu können, müssen wir zunächst einen neuen Routenprozessor erstellen und ihn unserem Dateiserver zuordnen:

func main() {
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
    http.ListenAndServe(":8080", nil)
}
Nach dem Login kopieren

Dabei ist /static/ das virtuelle Verzeichnis, das wir verwenden möchten, und static das tatsächliche Verzeichnis in der lokalen Dateisystemtabelle der Inhalte. Die Verwendung der Funktion http.StripPrefix() kann uns dabei helfen, das Pfadpräfix statischer Dateien zu entfernen. Die Funktion http.FileServer() erstellt eine neue Dateiserverinstanz.

Dateipfad

Bei Verwendung dieser Methode zeigt der im Browser angezeigte Pfad nur das von uns festgelegte virtuelle Verzeichnis an. Auf diese Weise kann unser Dateiverzeichnis ausgeblendet werden. Wenn wir beispielsweise eine Datei mit dem Namen test.html im Verzeichnis /static des lokalen Dateisystems ablegen, ist sie über http://localhost:8080/static/test.html zugänglich.

Verwenden Sie die GZIP-Komprimierung

Zusätzlich zum Ausblenden von Dateipfaden können wir auch die GZIP-Komprimierungstechnologie verwenden, um die Leistung weiter zu verbessern. Durch die Verwendung der gzip-Komprimierung können wir die an den Client gesendete Dateigröße reduzieren und so die Ladegeschwindigkeit und die Antwortzeit des Clients verbessern. Um die gzip-Komprimierung zu verwenden, müssen wir dem Routenprozessor etwas Code hinzufügen:

func main() {
    staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("static")))
    http.Handle("/static/", gzipFileServer(staticHandler))
    http.ListenAndServe(":8080", nil)
}

func gzipFileServer(handler http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
            w.Header().Set("Content-Encoding", "gzip")
            gz := gzip.NewWriter(w)
            defer gz.Close()
            gzr := gzipResponseWriter{Writer: gz, ResponseWriter: w}
            handler.ServeHTTP(gzr, r)
            return
        }
        handler.ServeHTTP(w, r)
    }
}

type gzipResponseWriter struct {
    io.Writer
    http.ResponseWriter
}

func (w gzipResponseWriter) Write(b []byte) (int, error) {
    return w.Writer.Write(b)
}
Nach dem Login kopieren

Dieser Routenprozessor ähnelt immer noch dem vorherigen, außer dass wir eine neue gzipFileServer-Funktion verwenden, um die Anfrage zu verarbeiten. Darin analysieren wir das Feld „Accept-Encoding“ im Anforderungsheader und verarbeiten die Datei, wenn es gzip enthält, mit der gzip-Komprimierung. Andernfalls verwenden wir für die Bearbeitung die Originaldatei.

Wenn die Komprimierung abgeschlossen ist, müssen wir die Content-Encoding im Antwortheader auf gzip setzen, um sicherzustellen, dass der Client die Antwort korrekt dekomprimieren kann.

Tatsächlich ist dies nur ein einfaches Beispiel. In der Praxis müssen wir den oben genannten Code in unseren eigenen Dienst integrieren und weitere Tests und Optimierungen durchführen.

Zusammenfassung

Durch die Verwendung der von der Go-Sprache bereitgestellten FileServer-Funktion können wir statische Dateien oder Ressourcen ausblenden und so deren Sicherheit schützen. Darüber hinaus können wir auch die gzip-Komprimierungstechnologie verwenden, um die Leistung zu verbessern. Diese Technologien können uns dabei helfen, sicherere und effizientere statische Dateien oder Ressourcendienste zu erstellen, und sie alle sind sehr praktische Fähigkeiten bei der Entwicklung mit der Go-Sprache.

Das obige ist der detaillierte Inhalt vonDer statische Golang-Dienst ist ausgeblendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage