4

这个问题说明了一切。本教程:https ://www.html5rocks.com/en/tutorials/cors/至少Access-Control-Allow-Origin: *要在服务器的响应中添加一个标头。

我的应用程序,运行 Hunchentoot,不返回它:

<!-- GET http://127.0.0.1:9000/ -->
<!-- HTTP/1.1 200 OK -->
<!-- Date: Fri, 13 Oct 2017 23:26:58 GMT -->
<!-- Server: Hunchentoot 1.2.37 -->
<!-- Keep-Alive: timeout=20 -->
<!-- Connection: Keep-Alive -->
<!-- Transfer-Encoding: chunked -->
<!-- Content-Type: text/html;charset=utf-8 -->
<!-- Request duration: 0.004275s -->

我查看了 Hunchentoot的文档及其headers.lisp文件,但找不到任何特定于 CORS 的内容,并且不明白如何简单地添加标题。

有什么帮助吗?谢谢 !


编辑:我实际上正在使用 Lucerne 和 Clack。

(in-package :cl-user)
(defpackage lisp-todo
  (:use :cl
        :lucerne)
  (:export :app)
  (:documentation "Main lisp-todo code."))
(in-package :lisp-todo)

添加

(defun change-headers (headers)
  (setf (lack.response:response-headers *response*) headers))

抄送抄送 =>

包缺少.response 不存在。

或使用 Hunchentoot:

(setf (hunchentoot:header-out "Access-Control-Allow-Origin") "*")

变量 Hunchentoot:*reply* 未绑定。

实际上这个变量是用 定义的def-unbound


edit2:尝试使用 Ningle

(in-package :cl-user)
(defpackage todobackend-ningle
  (:use :cl))
(in-package :todobackend-ningle)

;; blah blah blah.

(defvar *response* nil "") ;; to try the snippet below

(defun change-headers (headers)
  ;; (setf (lack.response:response-headers *response*) headers)) ;; => the value nil is not of type lack.response:response
  (setf (lack.response:response-headers lack.response:response) headers)) ;; => unbound

(defvar *app* (make-instance 'ningle:<app>))

(change-headers '(:access-control-allow-origin "*"))

(setf (ningle:route *app* "/")
      (lambda (params) ;; is that right ?
           (change-headers '(:access-control-allow-origin "*"))
           "Welcome to ningle!"))
4

1 回答 1

1

这是我用于 Clack with Ningle 的代码,希望它可以帮助你:

(defpackage ...
  (:use :cl :ningle))
(in-package ...)

(defun change-headers (headers)
  (setf (lack.response:response-headers *response*) headers))

(defmacro api-route (url method en-tetes &body corps)
  `(setf (ningle:route *app* ,url :method ,method)
     ;; that's why your code doesn't work, you actually have to pass a #'function
     #'(lambda (params)
         (change-headers ,headers)
         ,@corps)))

注意:*response*来自ningle.context,根据文件中的注释,我可能用错了。

该宏可用于创建路由并指定标头,如下所示:

(api-route
   "/"
   :get
   '(:access-control-allow-origin "*")
   "Welcome!")

请记住,这对于请求来说已经足够了GET,但对于其他动词,浏览器将首先点击OPTIONS。你必须至少用这些标题来回答它:

  '(:access-control-allow-methods "POST"          ; or any other verb(s)
    :access-control-allow-origin "*"
    :access-control-allow-headers "content-type")

这段代码来自我的一个小玩具项目。如果你愿意,你可以看看它的其余部分,希望它能给你一些想法。这没什么大不了的,可能有更好的方法来做到这一点,但是,嘿——它有效。

于 2017-10-14T22:09:53.927 回答