如何使用freemarker删除liferay DXP自定义主题中的cookie?
Posted
技术标签:
【中文标题】如何使用freemarker删除liferay DXP自定义主题中的cookie?【英文标题】:how to delete a cookie in liferay DXP custom theme using freemarker? 【发布时间】:2019-01-12 19:06:35 【问题描述】:我想在我的 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”:
a-用户注销
b-会话超时
for(a) 我已经通过实现 logoutPostAction 钩子完成了第一部分(因为注销操作不会清除 cookie,所以我需要手动执行此操作)
对于 (b) 我尝试实现 sessionDestroyAction 挂钩,但我没有请求和响应仅删除 cookie httpSession
所以当会话超时将我重定向到登录页面或主页时,我求助于删除 cookie 的解决方案,因此尝试在我的自定义主题中执行此操作。
我希望此更新能够清楚地描述我的问题,并尝试帮助我解决我的问题?
【问题讨论】:
【参考方案1】:您在主题中做一些积极的工作,但主题通常被认为是相当被动的:它提供应用程序的外观和感觉,而不是任何额外的业务逻辑。
考虑将修改 Cookie 的代码移动到 portlet 中 - 并进入操作阶段,此时您可以更改状态并且将响应标头写入结果页面还为时过早。渲染主题后,不能保证能够渲染 HTTP 标头(您尝试为 Cookie 执行此操作)。如果页面的第一个字节已经传送到浏览器,而你的 freemarker 主题到达这些行,它们仍然会失败。即使看起来它们可以工作:它们可能仅在负载下失败,而调试此类事件特别困难。
或者,或者,您实际上是在做什么,才导致您想出这个解决方案?我看不出我可以使用此解决方案解决的问题 - 如果您提出解决基本问题的建议,我们可能会为您提供帮助。
编辑:关于您编辑的问题 B(因为 A 似乎已解决):在会话到期时设置 cookie:根据规范,这永远不会起作用。因为会话在服务器端过期,而浏览器没有请求任何内容(这就是您没有请求和响应对象的原因:浏览器可能已脱机或半小时前终止 - 您只是无法访问它这一点)。
如果您的 USERID 是合理的,并且在会话结束后不得出现在浏览器上:请勿将其存储在 cookie 中。从会话(服务器端)使用 if 就可以了。你在追逐一个无法解决的问题。
永远不要只对 cookie 值采取行动 - 始终确保它没有被篡改。
【讨论】:
谢谢你的回复,请看我问题的更新 完成。很好的澄清,明确了你的目标。 我可以使用 javascript 或 jquery 删除 cookie 吗? 如果它是 httpOnly cookie:否。否则:可能(至少用另一个值覆盖)。但是您不会在浏览器端收到任何 sessionDestroyed 事件。而且,如果您轮询服务器以查看会话是否已过期,则每个轮询调用都会延长会话......您想用这个实现什么?你为什么担心?我不知道名为 USERID 的 Liferay cookie - 这是你自己的吗?只是不要一开始就设置它,然后你就不必删除任何东西。 我使用这种方法来跟踪用户活动。我想在每个请求中记录用户 ID 通过 apache 并登录到访问日志。是的 USERID 是我自己的以上是关于如何使用freemarker删除liferay DXP自定义主题中的cookie?的主要内容,如果未能解决你的问题,请参考以下文章
如何获得可重复的文本字段 liferay7 Freemarker 之一
使用 freemarker 构建 Liferay 7 巨型菜单(多级菜单)
Liferay 7 - 在 Freemarker 中从 DDLRecord 获取动态属性
Liferay,来自搜索的 Freemarker 错误模板,但不是来自其他链接