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

时间:2018-08-05 18:29:31

标签: freemarker liferay-7 liferay-theme liferay-velocity liferay-dxp

我想在liferay自定义主题免费标记模板

中删除 USERID 的cookie。

我正在使用 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 个答案:

答案 0 :(得分:0)

您正在主题中进行一些积极的工作,但是通常认为主题是被动的:主题提供了应用程序的外观,而不提供任何其他业务逻辑。

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

或者,或者:您实际上是在尝试什么导致您提出此解决方案?我看不到此解决方案可以解决的问题-如果您将其命名,我们也许可以为您提供解决潜在问题的建议。

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

如果您的USERID明智,并且在会话结束后一定不能在浏览器上:不要将其存储在cookie中。如果从会话(服务器端)使用if,那么一切就很好了。您正在追逐一个无法解决的问题。

并且永远不要仅对cookie值进行操作-始终确保它未被篡改。