Liferay: Как добавить cookie из портлета из doEdit(требование RenderRequest, разрешение RenderResponse)
Я пытаюсь установить cookie из метода doEdit портлета следующим образом:
Public void doEdit(RenderRequest request, RenderResponse response)
throws PortletException, IOException
{
Cookie cookie = new Cookie("url","mkyong dot com");
cookie.setMaxAge(60*60); //1 hour
res.addCookie(cookie);
}
Здесь я получаю сообщение об ошибке типа: Метод addCookie(Cookie) не определен для типа RenderResponse
Так может ли кто-нибудь помочь мне
3 ответа
Примечание. В спецификации портлета есть следующее:
PLT.12.1.4 Настройка файлов cookie
Портлет может установить HTTP-куки в ответ через
addProperty
метод сjavax.servlet.http.Cookie
в качестве параметра. Приложение портала не обязано передавать cookie клиенту. Таким образом, портлет не должен предполагать, что у него есть доступ к cookie на клиенте или что запрос, вызванный URL-адресами, не сгенерированными API-интерфейсом портлета, может получить доступ к cookie.Файлы cookie, установленные в ответе на один вызов жизненного цикла, должны быть доступны портлету при последующих вызовах жизненного цикла, например, установка файла cookie в
processAction
следует включить портлет для получения куки в следующемrender
вызов.Для запросов, запускаемых через URL портлета, портлет должен получить cookie. Файлы cookie можно получить через
request.getCookies
метод.Куки-файлы - это свойства, и все ограничения, указанные выше в отношении свойств, также применяются к куки-файлам, т. Е. Для успешной передачи обратно клиенту куки-файлы должны быть установлены до принятия ответа. Печенье установлено в
render
или жеserveResource
после принятия ответа контейнер портлета будет игнорироваться.При установке файлов cookie на этапе жизненного цикла рендера портлеты должны устанавливать файлы cookie в части заголовков рендеринга или просто переопределять
GenericPortlet.doHeaders
метод для максимальной производительности во всех реализациях портала (см. PLT.11.1.1.4.3).
Таким образом, если вы буквально зависите от HTTP-куки, который будет доступен в браузере: вы не можете предполагать, что он есть, поскольку это только внутреннее "свойство" портала, имитирующее поведение куки-файла.
Если вам нужен файл cookie, доступный через HTTP/ браузер, вам придется зависеть от реализации портала (проверить его) или установить его с помощью Javascript, либо найти другое решение. Если вам просто нужны данные, используйте addProperty
Так же, как Ankit P упоминает в другом ответе. Я сомневаюсь, хотя (из-за спецификации), что вам нужно будет получить HttpServletRequest
для этого: печенье должно быть доступно на PortletRequest
(портлета, инициирующего запрос) уже.
Попытка установки через addProperty(.)
import com.liferay.util.CookieUtil;
Cookie cookie = new Cookie("url","mkyong dot com");
cookie.setMaxAge(60*60);
renderResponse.addProperty(cookie);
To read cookie from request:
HttpServletRequest request = PortalUtil.getHttpServletRequest(
portletRequest);
url = CookieUtil.get(request, "url");
Попробуйте использовать приведенный ниже код для создания куки
Cookie paramCookie = new Cookie("Key", "Vishal Shah");
paramCookie.setVersion(0);
paramCookie.setMaxAge(4 * 24 * 60 * 60); //4 days
renderResponse.addProperty(paramCookie);
В соответствии с вашим кодом вы пропустите строку установки версии.
Я использую эти строки кода в методе porcessAction(ActionRequest actionRequest, ActionResponse actionResponse), который работает правильно.