Liferay:如何从doEdit中添加来自portlet的cookie(RenderRequest req,RenderResponse res)

时间:2014-03-04 10:58:21

标签: liferay liferay-6 liferay-velocity

我正在尝试从portlet doEdit方法设置一个cookie,如下所示:

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 个答案:

答案 0 :(得分:4)

注意:Portlet spec有关于Cookie的说法:

  

PLT.12.1.4设置Cookies

     

portlet可以通过addProperty在响应中设置HTTP cookie   以javax.servlet.http.Cookie为参数的方法。门户网站   申请不需要将cookie转移到客户端。从而   portlet不应该假设它可以访问cookie上的cookie   客户端或该请求是由未生成的URL触发的   portlet API可以访问cookie。

     

应该可以使用在一个生命周期调用的响应中设置的Cookie   在后续生命周期调用中的portlet,例如,设置一个   processAction中的cookie应该使portlet能够检索   下一次render电话中的Cookie。

     

对于通过portlet URL触发的请求,portlet应该接收   支持cookie。可以通过request.getCookies检索Cookie   方法

     

Cookie是属性和上述所有限制   属性也适用于cookie,即成功传输   回到客户端,必须在响应之前设置cookie   承诺。响应后,Cookie设置为renderserveResource   提交将被portlet容器忽略。

     

在渲染生命周期阶段设置cookie时,应设置portlet   渲染标题中的cookie部分或简单地覆盖   GenericPortlet.doHeaders方法以便以最大值运行   所有门户实现的性能(见PLT.11.1.1.4.3)。

因此,如果你真的依赖于浏览器中的HTTP Cookie:你不能认为它存在,因为它只是一个门户内部的“属性”,模拟了cookie的行为。

如果你需要一个可在HTTP /浏览器上使用的Cookie,你必须依赖门户网站实现(检查它)或通过Javascript设置它,或者找到一个不同的解决方案。如果您只需要数据可用,请使用addProperty,就像Ankit P在另一个答案中提到的那样。我怀疑(由于规范)你需要为它获取HttpServletRequest:cookie应该在PortletRequest(发起请求的portlet)上可用。

答案 1 :(得分:0)

尝试通过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");

答案 2 :(得分:0)

尝试使用以下代码创建Cookie

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)方法正常工作。