0

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

我正在使用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-会话超时

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

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

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

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

4

1 回答 1

0

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

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

或者,或者:您实际上是在做什么,导致您想出了这个解决方案?我看不到我可以用这个解决方案解决的问题 - 如果你说出它的名字,我们也许可以帮助你解决你的潜在问题。

编辑:关于您编辑的问题 B(因为 A 似乎已解决):在会话到期时设置 cookie:根据规范,这将永远行不通。因为会话在服务器端过期,而浏览器没有请求任何内容(这就是您没有请求和响应对象的原因:浏览器可能已脱机或半小时前终止 - 您只是无法访问它这点)。

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

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

于 2018-08-05T19:55:32.980 回答