2014-09-22 103 views
3

我正嘗試在Grails應用程序中使用cookie,但沒有成功。特別是在測試套件控制器的show()方法中,我想將cookie設置爲最新的測試套件;也就是說,show()方法可用的params.id的值。然後,在list()方法中,我想提供一個顯示最近測試套件的快捷方式(我試圖用cookie設置的值)。如何在Grails中設置和檢索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}>" } 

我通過設置cookie的show()方法:

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

當我在列表和顯示視圖之間來回切換(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> 

在我看來,表明cookie「tcCookie」僅在show()方法中可見,這對我來說是無用的。我需要設置它,以便在其他方法中可見。

此外,Cookie tcCookie在多個會話中存活 - 如我所料 - 但仍然只在show()方法中可見。

也許我對餅乾的理解是錯誤的,但我仍然堅持。任何幫助,將不勝感激。另外,在瀏覽器中必須設置數百個其他Cookie,其中沒有一個是使用我使用的代碼可見的,那麼是否有某種方法可以訪問其他Cookie?

回答

2

的問題是設置cookie的時候沒有明確的副作用設置路徑。假設Grails應用程序的名稱是「應用程序」,將通過

http://hostname.com/app 

這個訪問將導致JSESSIONID的cookie被設置爲/app/JSESSIONID這將是可見的應用程序中的任何地方。由於應用程序的名稱在應用程序中可用作爲grailsApplication.metadata['app.name'],因此可以自動確定app的實際值。

然而,在一個單獨的視圖,例如list視圖在xxx_domain對象,如

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 
+0

你知道如何刪除cookie嗎?未將'maxAge'設置爲'0'> – akiong 2017-03-16 14:10:29

0

你應該嘗試使用這個插件:Cookie Plugin

的文檔可以發現here

下面的代碼展示瞭如何設置一個cookie:

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

在這裏,如何獲取您的Cookie中的價值:

cookieService.get('username') 

希望幫助

編輯

爲了您的最後一個問題,我想你只能從您的域名訪問保存cookie。

3

,或者你可以讀取基本的Java doc和使用純responserequest對象做到這一點:

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

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

不,這都沒有區別。我仍然無法看到show()方法之外的cookie。上面的代碼和原始代碼的唯一區別是將maxAge值設置爲零,並設置斜槓路徑,這兩者都不會影響可見性。 – hbrednek 2014-09-22 23:06:35

+0

make'request.cookies.each {println「list:cookie $ {it.properties}>」}'查看更多 – injecteer 2014-09-22 23:11:35

+0

仍然沒有區別。 JSESSIONID cookie在show()和list()中都可見,但我設置和關心的cookie僅在show()中可見。如果任何人在Grails的多個視圖中實際使用過Cookie,請告訴我這是多麼可能,因爲閱讀文檔和詢問用戶的問題並沒有提出爲什麼可見性存在差異,更重要的是,如何製作cookie用除了設定的方法以外的方法可見。 – hbrednek 2014-09-23 00:07:15

相關問題