0

我正在尝试从 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);
}

在这里我收到一个错误,例如:对于 RenderResponse 类型,方法 addCookie(Cookie) 是未定义的

所以任何人都可以帮助我

4

3 回答 3

4

注意:Portlet 规范对 c​​ookie有这样的说法:

PLT.12.1.4 设置 Cookie

Portlet 可以通过addProperty 带有javax.servlet.http.Cookieas 参数的方法在响应中设置 HTTP cookie。门户应用程序不需要将 cookie 传输到客户端。因此,portlet 不应该假定它可以访问客户端上的 cookie,或者使用不是由 portlet API 生成的 URL 触发的请求可以访问 cookie。

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

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

Cookies 是属性,上述关于属性的所有限制也适用于 cookie,即要成功传输回客户端,必须在提交响应之前设置 cookie。Portlet 容器将忽略在响应提交时render或提交响应之后设置的 Cookie 。serveResource

在呈现生命周期阶段设置 cookie 时,portlet 应该在呈现头部分设置 cookie,或者简单地覆盖该 GenericPortlet.doHeaders方法,以便在所有门户实现上以最高性能运行(参见 PLT.11.1.1.4.3)。

因此,如果您确实依赖于浏览器中可用的 HTTP Cookie:您不能假设它存在,因为它只是一个门户内部“属性”,模拟 cookie 的行为。

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

于 2014-03-04T12:35:03.317 回答
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");
于 2014-03-04T11:56:41.523 回答
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) 方法中使用上面的代码行,它工作正常。

于 2016-01-12T11:58:40.150 回答