如何在 Grails 中设置和检索 cookie?

hbr*_*nek 5 cookies grails

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

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

在展示()中:

request.cookies.each { println "show: cookie ${it.name} <${it.value}>" }
Run Code Online (Sandbox Code Playgroud)

在列表()中:

request.cookies.each { println "list: cookie ${it.name} <${it.value}>" }
Run Code Online (Sandbox Code Playgroud)

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

Cookie cookie = new Cookie( "tcCookie", params.id )
cookie.maxAge = 315360000000L
response.addCookie( cookie )
Run Code Online (Sandbox Code Playgroud)

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

show: cookie tcCookie <277>
show: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>
list: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>
show: cookie tcCookie <277>
show: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>
list: cookie JSESSIONID <9DEBFB40F78B5E24A92C750157342069>
Run Code Online (Sandbox Code Playgroud)

在我看来,这表明 cookie“tcCookie”仅在 show() 方法中可见,这对我来说是无用的。我需要设置它以便它在其他方法中可见。

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

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

hbr*_*nek 5

该问题是在未显式设置路径的情况下设置 cookie 的副作用。假设 Grails 应用程序的名称是“app”,它将通过以下方式访问

http://hostname.com/app
Run Code Online (Sandbox Code Playgroud)

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

但是,在单个视图中,例如对象list中的视图xxx_domain,可以作为

http://hostname.com/app/xxx_domain/list
Run Code Online (Sandbox Code Playgroud)

使用代码设置 cookie

def newCookie = new Cookie( "myCookie", "cookieValue" )
response.addCookie newCookie
Run Code Online (Sandbox Code Playgroud)

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

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