2014-09-22 3 views
3

Я пытаюсь использовать cookie в приложении Grails без успеха. В частности, в методе show() контроллера тестового набора я хочу установить cookie как последний показанный набор тестов; то есть значение params.id, доступное для метода show(). Затем, в методе list(), я хочу предоставить ярлык для показа самого последнего набора тестов (значение, которое я пытаюсь установить с помощью файла cookie).Как установить и получить куки в Grails?

Однако 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 cookie = new Cookie("tcCookie", params.id) 
cookie.maxAge = 315360000000L 
response.addCookie(cookie) 

Когда я перехожу назад и вперед между списком и видами просмотра (после show() с параметром. 27 =), я получаю:

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

Проблема является побочным эффектом установки куки без явного установив путь.Предполагая, что имя приложения Grails является «приложение» было бы получить доступ

http://hostname.com/app 

Это заставит печенье JSESSIONID быть установлен как /app/JSESSIONID, который будет виден в любом месте приложения. Поскольку имя приложения доступно в приложении как grailsApplication.metadata['app.name'], определение фактического значения app может быть сделано автоматически.

Однако в индивидуальной точки зрения, например, list вид в xxx_domain объекта, доступ как

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

установки печенье с кодом

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

установит путь newCookie к /app/xxx_domain/list/, где он будет виден только в методе list(). Для того, что печенье, чтобы быть видимым в любом месте приложения, путь должен быть установлен, как показано в приведенном выше ответе, но не к /, скорее /app как в

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

Вы знаете, как удалить cookie? не задайте 'maxAge'' 0'> – akiong

0

Вы должны попытаться использовать этот плагин: Cookie Plugin

Документация может быть найдена here

Следующий код покажет вам, как установить куки:

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

И здесь, Как получить значение в вашем файле cookie:

cookieService.get('username') 

Надежда, что помогает

EDIT

Для вашего последнего вопроса, я думаю, что вы можете получить доступ только куки (ы) с вашего домена.

3

или вы можете прочитать основную Java документ и использовать простые response и request объекты, чтобы сделать это:

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

и

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

Нет, это не делает никакой разницы. Я все еще не вижу cookie вне метода show(). Единственное отличие в вышеприведенном коде и оригинале заключается в том, что значение maxAge равно нулю и путь к косой черте, ни одна из которых не делает различий в видимости. – hbrednek

+0

сделать 'request.cookies.each {println" list: cookie $ {it.properties}> "}', чтобы увидеть больше – injecteer

+0

Все равно никакой разницы. Файл cookie JSESSIONID отображается как в show(), так и в списке(), но cookie, который я установил и заботясь, отображается только в show(). Если кто-то действительно использовал куки-файлы в нескольких представлениях в Grails, пожалуйста, покажите мне, как это возможно, потому что в документации для чтения и задании вопросов пользователям не было предложено, почему существует разница в видимости или, что более важно, как сделать cookie видимый в методе, отличном от метода, в котором он был установлен. – hbrednek

Смежные вопросы