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), который работает правильно.

Другие вопросы по тегам