如何使用 freemarker 删除 liferay DXP 自定义主题中的 cookie?

how to delete a cookie in liferay DXP custom theme using freemarker?

我想在我的 liferay 自定义主题免费标记模板中删除一个 cookie USERID

我正在使用 liferay DXP

我试过这个代码

<#if !is_signed_in>
    <#assign aCK=objectUtil("com.liferay.portal.kernel.util.CookieKeys") />
    <#assign userID = aCK.getCookie(request,"USERID") /> 
    <#assign VOID=aCK.deleteCookies(request, response,aCK.getDomain(request), "USERID") />

    </#if>

</#if>

但是给我空指针异常因为我有空响应!

有人可以帮我试试吗?

更新:我的主要目的是删除特定的 cookie "USERID" when:

a-the user logout

b-the session timeout

for(a) 我已经通过实现 logoutPostAction 挂钩完成了第一部分(因为注销操作不会清除 cookie,所以我需要手动执行此操作)

for (b) 我试图实现 sessionDestroyAction 挂钩,但我没有请求和响应仅删除 cookie httpSession

所以我转向了在会话超时时将我重定向到登录页面或主页时删除 cookie 的解决方案,因此尝试在我的自定义主题中执行此操作。

我希望这次更新能够清楚地描述我的问题,并尝试帮助我解决问题?

您在主题中做一些主动工作,但主题通常被认为是相当被动的:它提供应用程序的外观,而不是任何额外的业务逻辑。

考虑将修改 Cookie 的代码移动到一个 portlet 中 - 然后进入操作阶段,此时您可以更改状态并且还可以提前将响应 headers 写入结果页面。呈现主题后,您不能保证能够呈现 HTTP headers(您正在尝试为 Cookie 做的)。如果在您的 freemarker 主题到达这些行时页面的第一个字节已经传送到浏览器,它们仍然会失败。即使它们看起来可以工作:它们可能只在负载下失败,而调试此类事件特别困难。

或者,或者,您实际上是想做什么,导致您想出这个解决方案?我看不到我可以使用此解决方案解决的问题 - 如果您提出问题,我们也许可以为您提供解决潜在问题的建议。

编辑: 关于您编辑的问题 B(因为 A 似乎已解决):session 过期时设置 cookie:这永远行不通,作者规格。因为 session 在服务器端过期,浏览器没有请求任何东西(这就是为什么你没有请求和响应 object 的原因:浏览器可能半小时前已经脱机或终止 - 你目前还无法达到它)。

如果您的 USERID 是合理的并且在 session 结束后不能出现在浏览器上:不要将其存储在 cookie 中。从 session (服务器端)使用 if 就可以了。你正在追逐一个无法解决的问题。

永远不要只根据 cookie 值采取行动 - 始终确保它没有被篡改。