【问题标题】:Liferay: How to add cookie from portlet from doEdit(RenderRequest req,RenderResponse res)Liferay:如何从 doEdit(RenderRequest req,RenderResponse res) 的 portlet 添加 cookie
【发布时间】:2016-01-12 19:58:40
【问题描述】:

我正在尝试从 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) 是未定义的

谁能帮帮我

【问题讨论】:

    标签: liferay liferay-6 liferay-velocity


    【解决方案1】:

    注意:Portlet spec 对 cookie 有这样的说法:

    PLT.12.1.4 设置 Cookies

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

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

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

    Cookies 是属性和上面提到的所有限制 属性也适用于 cookie,即成功传输 返回客户端,必须在响应之前设置 cookie 坚定的。响应后在renderserveResource 中设置的cookies 已提交将被 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 的)上可用。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      尝试使用以下代码创建 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) 方法正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 2023-03-31
        • 2019-11-30
        相关资源
        最近更新 更多