【问题标题】:How to set and retrieve cookies in Grails?如何在 Grails 中设置和检索 cookie?
【发布时间】:2014-11-16 23:01:16
【问题描述】:

我正在尝试在 Grails 应用程序中使用 cookie,但没有成功。特别是,在测试套件控制器的 show() 方法中,我想将 cookie 设置为显示的最新测试套件;也就是说,可用于 show() 方法的 params.id 的值。然后,在 list() 方法中,我想提供一个快捷方式来显示最新的测试套件(我尝试使用 cookie 设置的值)。

但是,我设置的 cookie(名为“tcCookie”)仅在 show() 方法中可见,而在 list() 方法中不可见。代码如下:

在显示()中:

request.cookies.each { println "show: cookie ${it.name} <${it.value}>" }

在列表()中:

request.cookies.each { println "list: cookie ${it.name} <${it.value}>" }

我通过以下方式在 show() 方法中设置 cookie:

Cookie cookie = new Cookie( "tcCookie", params.id )
cookie.maxAge = 315360000000L
response.addCookie( cookie )

当我在列表和显示视图之间来回切换时(在使用 params.id = 277 的 show() 之后)我得到:

show: cookie tcCookie <277>
show: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>
list: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>
show: cookie tcCookie <277>
show: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>
list: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>

在我看来,这表明 cookie “tcCookie”仅在 show() 方法中可见,这对我来说毫无用处。我需要对其进行设置,使其在其他方法中可见。

此外,cookie tcCookie 在多个会话中仍然存在 - 正如我所期望的那样 - 但仍然仅在 show() 方法中可见。

也许我对 cookie 的理解是错误的,但我还是被卡住了。任何帮助,将不胜感激。此外,浏览器中必须设置数百个其他 cookie,使用我使用的代码都看不到这些 cookie,那么有什么方法可以访问其他 cookie 吗?

【问题讨论】:

    标签: grails cookies


    【解决方案1】:

    问题是在没有明确设置路径的情况下设置 cookie 的副作用。假设 Grails 应用程序的名称是“app”,它将被

    访问
    http://hostname.com/app
    

    这将导致cookie JSESSIONID 设置为/app/JSESSIONID,这将在应用程序的任何位置可见。由于应用程序的名称在应用程序中作为grailsApplication.metadata['app.name'] 可用,因此可以自动确定app 的实际值。

    但是,在单个视图中,例如 xxx_domain 对象中的 list 视图,访问为

    http://hostname.com/app/xxx_domain/list
    

    使用代码设置 cookie

    def newCookie = new Cookie( "myCookie", "cookieValue" )
    response.addCookie newCookie
    

    newCookie 的路径设置为/app/xxx_domain/list/,它只在list() 方法和视图中可见。为了使该 cookie 在应用程序中的任何位置可见,必须按照上述答案设置路径,但不能设置为 /,而是设置为 /app,如

    def newCookie = new Cookie( "myCookie", "cookieValue" )
    newCookie.path = "/${grailsApplication.metadata['app.name']}/"
    response.addCookie newCookie
    

    【讨论】:

    • 你知道如何删除cookie吗?未将 maxAge 设置为 0>
    【解决方案2】:

    或者您可以阅读基本的 Java 文档并使用普通的 responserequest 对象来做到这一点:

    Cookie homeCookie = new Cookie( 'home', 'name' )
    homeCookie.path = '/'
    homeCookie.maxAge = 0
    response.addCookie homeCookie
    

    String home = request.cookies.find{ 'home' == it.name }?.value
    

    【讨论】:

    • 不,没有区别。我仍然看不到 show() 方法之外的 cookie。上述代码和原始代码的唯一区别是将 maxAge 值设置为零和斜线路径,这两者都不会影响可见性。
    • 制作request.cookies.each { println "list: cookie ${it.properties}&gt;" }查看更多
    • 仍然没有区别。 JSESSIONID cookie 在 show() 和 list() 中都可见,但我设置和关心的 cookie 仅在 show() 中可见。如果有人在 Grails 的多个视图中实际使用过 cookie,请告诉我这是如何实现的,因为阅读文档和询问用户问题并没有提出为什么可见性存在差异,或者更重要的是,如何制作 cookie在设置它的方法以外的方法中可见。
    • 你能在浏览器的选项中看到你的cookie吗?
    • 是的 - 这指出了问题所在。实际上,正在为 cookie 设置路径,但是按照您的建议设置路径“/”并不能完成工作。我将作为单独的答案更全面地回答我自己的问题。
    【解决方案3】:

    你应该尝试使用这个插件:Cookie Plugin

    文档可以在here找到

    下面的代码告诉你如何设置一个 cookie:

    cookieService.setCookie('username', 'cookieUser123')
    

    在这里,如何获取 cookie 中的值:

    cookieService.get('username')
    

    希望有帮助

    编辑

    对于您的最后一个问题,我认为您只能从您的域访问 cookie。

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 2011-08-02
      • 2013-10-19
      • 2015-03-06
      • 2023-03-30
      • 2017-04-20
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多