【问题标题】:Swift Vapor Cookies not workingSwift Vapor Cookies 不工作
【发布时间】:2017-05-28 19:25:11
【问题描述】:

我正在尝试创建 cookie,但在浏览器中没有看到任何 cookie。取而代之的是,我在 Postman 上得到了不同的输出,在 chrome 浏览器上得到了不同的输出。

blow 是我创建 cookie 的编码方式。

  1. 创建路线

    drop.get("create", handler:createCookie)
    
  2. 处理程序

    func createCookie(request: Request) throws -> ResponseRepresentable {
    
    let cookie = Cookie(name: "login", value:"value", expires: generateExpirationDate(), secure: true)
    request.cookies.insert(cookie)
    
    return "Done"
    }
    
  3. 下面是创建过期处理程序的函数

     func generateExpirationDate() -> Date {
      return Date() + (60 * 1) // 1 Minutes later
     }
    

在 post man 中,我得到一个名为“vapor-sessions”的 cookie

在 chrome 浏览器中,我得到两个 cookie,如下图所示。

但我想要的不在那儿。 !!!!!!!!!

编辑

我也尝试过下面的代码,但 Postman 没有运气,但是这个“在 chrome 中工作”,我对其他浏览器有疑问!!!!

func createCookie(request: Request) throws -> ResponseRepresentable {

    let cookie = Cookie(name: "login", value:"value", expires: generateExpirationDate(), secure: true)

    let response = try Response(status: .ok, json: JSON(node: [
        "yo": "yoyo"
        ]))

    response.cookies.insert(cookie)


    return response
}

【问题讨论】:

    标签: swift cookies session-cookies vapor


    【解决方案1】:

    在本地环境下 cookie 没有运行,我在 Postman 上也遇到过同样的问题,你可以在真实环境中尝试,例如 Heroku,它是免费的。

    也许您可以测试使用 Postman 应用程序 Interceptor Cookies plugin 的 cookie。

    这段代码对我有用,我正在使用中间件控制器来设置 cookie..

    let auth = AuthMiddleware(user: User.self) { value in
            return Cookie(
                name: "your_cookie_name",
                value: value,
                expires: Date().addingTimeInterval(60 * 60 * 5), // 5 hours
                secure: true,
                httpOnly: true
            )
        }
        drop.middleware.append(auth)
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      您的预编辑代码不起作用,因为您将 cookie 添加到 request,而不是 response。响应是发送到浏览器的内容,因此这是设置 cookie 的正确位置。

      这是一个完整的例子:

      import Foundation
      import Cookies
      import HTTP
      import Vapor
      
      let drop = Droplet()
      
      drop.get("create") { request in
        let response = Response(status: .ok)
        let expiry = Date(timeIntervalSinceNow: 60)
        let cookie = Cookie(name: "login", value: "value", expires: expiry)
        response.cookies.insert(cookie)
        return response
      }
      
      drop.run()
      

      使用curl查看Vapor发送的headers,可以清楚的看到cookie是在哪里设置的。

      HTTP/1.1 200 OK
      Set-Cookie: login=value; Expires=Sat, 14 Jan 2017 05:31:32 GMT; Path=/
      Date: Sat, 14 Jan 2017 05:30:32 GMT
      Content-Length: 0
      

      【讨论】:

      • 但正如我所说,使用 cookie 返回响应不适用于 Postman 应用程序,我也怀疑其他浏览器。我会在所有流行的浏览器上尝试这个,并且会再次更新我的问题。
      • 我已经编辑了我的答案以包含一个完整的、可运行的示例。如果客户端应用程序不尊重 cookie,这取决于客户端,而不是服务器。 Vapor 正在发送正确的标头。它应该对所有常见的浏览器都是安全的。
      猜你喜欢
      • 2018-08-13
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多