Próbuję ustawić nagłówek na moim serwerze internetowym Go. Używam gorilla/mux
i net/http
pakietów.
Chcę Access-Control-Allow-Origin: *
zezwolić na obsługę AJAX w wielu domenach.
Oto mój kod Go:
func saveHandler(w http.ResponseWriter, r *http.Request) {
// do some stuff with the request data
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/save", saveHandler)
http.Handle("/", r)
http.ListenAndServe(":"+port, nil)
}
net/http
Pakiet zawiera dokumentację opisującą wysyłanie nagłówków HTTP, jak gdyby był to klient - Nie jestem do końca pewien, jak do nagłówków odpowiedzi ustawić?
http
go
cors
http-headers
Zen
źródło
źródło
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
withCredentials:true
(wartość „*” jest niedozwolona, gdy wysyłane są poświadczenia, co jest częstym przypadkiem użycia). Musisz ustawić źródło na żądającym (zobacz odpowiedź Matta Bucci poniżej, aby dowiedzieć się, jak to zrobić).Wszystkie powyższe odpowiedzi są błędne, ponieważ nie obsługują one żądania wstępnego OPTIONS, rozwiązaniem jest zastąpienie interfejsu routera mux. Zobacz żądanie pobrania AngularJS $ http nie powiodło się z niestandardowym nagłówkiem (dozwolone w CORS)
źródło
Access-Control-Allow-Credentials": "true"
o żądaniach z plikami cookie httpOnly.Nie używaj znaku „*” dla Origin, dopóki naprawdę nie potrzebujesz całkowicie publicznego zachowania.
Jak mówi Wikipedia :
Oznacza to, że otrzymasz wiele błędów, zwłaszcza w Chrome, gdy spróbujesz zaimplementować na przykład proste uwierzytelnianie.
Oto poprawione opakowanie:
I nie zapomnij odpowiedzieć na wszystkie te nagłówki na żądanie OPCJI inspekcji wstępnej.
źródło
router.HandleFunc("/user/action", user.UserAction) http.Handle("/", router) http.ListenAndServe(":8080", nil).Set("Access-Control-Allow-Origin", "*")
router.HandleFunc("/user/action", addDefaultHeaders(user.UserAction))
jednak mam około 16 tras, co nie jest idealne, czy istnieje sposób, aby określić je jako opakowanie w pakiecie http lub warstwie routera muxUstaw odpowiednie oprogramowanie pośredniczące golang, aby można było użyć go ponownie w dowolnym punkcie końcowym.
Typ i funkcja pomocnika
Rzeczywiste oprogramowanie pośredniczące
Punkt końcowy
PAMIĘTAJ! Oprogramowanie pośredniczące jest stosowane w odwrotnej kolejności (ExpectGET () uruchamia się jako pierwsza)
źródło
Jeśli nie chcesz zastąpić routera (jeśli nie masz aplikacji skonfigurowanej w sposób, który to obsługuje lub chcesz skonfigurować CORS na podstawie trasy po trasie), dodaj obsługę OPTIONS do obsługi żądania przed lotem .
To znaczy, z Gorilla Mux Twoje trasy wyglądałyby tak:
Zauważ powyżej, że oprócz naszej obsługi POST, definiujemy konkretną procedurę obsługi metody OPTIONS .
A następnie, aby faktycznie obsłużyć metodę preflight OPTIONS, możesz zdefiniować AccountsCreatePreFlight w następujący sposób:
To, co naprawdę sprawiło, że to wszystko kliknęło dla mnie (oprócz faktycznego zrozumienia, jak działa CORS), to fakt, że metoda HTTP żądania inspekcji wstępnej różni się od metody HTTP rzeczywistego żądania. Aby zainicjować CORS, przeglądarka wysyła żądanie inspekcji wstępnej z opcjami metody HTTP, które należy obsługiwać jawnie na routerze, a następnie, jeśli otrzyma odpowiednią odpowiedź
"Access-Control-Allow-Origin": origin
(lub „*” dla wszystkich) z aplikacji, inicjuje rzeczywistą żądanie.Uważam również, że możesz zrobić "*" tylko dla standardowych typów żądań (np.: GET), ale dla innych będziesz musiał jawnie ustawić źródło, tak jak ja powyżej.
źródło
Tworzę opakowanie dla tego przypadku:
źródło
Miałem ten sam problem co powyżej, powyższe rozwiązania są poprawne, konfiguracja jest następująca 1) Angularjs dla Klienta 2) Framework Beego dla serwera GO
Postępuj zgodnie z poniższymi punktami 1) Ustawienia CORS muszą być włączone tylko na serwerze GO 2) NIE dodawaj żadnego typu nagłówków w angularJS z wyjątkiem tego
W serwerze you GO dodaj ustawienia CORS, zanim żądanie zacznie być przetwarzane, aby żądanie preflight otrzymało 200 OK, po czym metoda OPTIONS zostanie przekonwertowana na GET, POST, PUT lub jakikolwiek inny typ żądania.
źródło
Wiem, że to inna zmiana w odpowiedzi, ale czy nie dotyczy to bardziej serwera WWW? Na przykład może pomóc nginx .
Dodanie nginx przed usługą go w produkcji wydaje się rozsądne. Zapewnia o wiele więcej funkcji autoryzacji, rejestrowania i modyfikowania żądań. Daje również możliwość kontrolowania, kto ma dostęp do Twojej usługi, i nie tylko, ale można określić różne zachowania dla określonych lokalizacji w Twojej aplikacji, jak pokazano powyżej.
Mógłbym dalej mówić o tym, dlaczego warto używać serwera WWW z interfejsem go api, ale myślę, że to temat na inną dyskusję.
źródło