如何使用 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 值采取行动 - 始终确保它没有被篡改。
我想在我的 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 值采取行动 - 始终确保它没有被篡改。