corsmiddleware.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package middleware
  2. import "net/http"
  3. // CorsMiddleware 跨域请求处理中间件
  4. type CorsMiddleware struct {
  5. }
  6. // NewCorsMiddleware 新建跨域请求处理中间件
  7. func NewCorsMiddleware() *CorsMiddleware {
  8. return &CorsMiddleware{}
  9. }
  10. // Handle 跨域请求处理
  11. func (m *CorsMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
  12. return func(w http.ResponseWriter, r *http.Request) {
  13. setHeader(w)
  14. // 放行所有 OPTIONS 方法
  15. if r.Method == "OPTIONS" {
  16. w.WriteHeader(http.StatusNoContent)
  17. return
  18. }
  19. // 处理请求
  20. next(w, r)
  21. }
  22. }
  23. // Handler 跨域请求处理器
  24. func (m *CorsMiddleware) Handler() http.Handler {
  25. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  26. setHeader(w)
  27. if r.Method == "OPTIONS" {
  28. w.WriteHeader(http.StatusNoContent)
  29. } else {
  30. w.WriteHeader(http.StatusNotFound)
  31. }
  32. })
  33. }
  34. // setHeader 设置响应头
  35. func setHeader(w http.ResponseWriter) {
  36. w.Header().Set("Access-Control-Allow-Origin", "*")
  37. w.Header().Set("Access-Control-Allow-Headers", "*")
  38. w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH")
  39. w.Header().Set("Access-Control-Expose-Headers", "Content-Length, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
  40. w.Header().Set("Access-Control-Allow-Credentials", "true")
  41. }