【问题标题】:Show custom error page after forcing logout in Liferay在 Liferay 中强制注销后显示自定义错误页面
【发布时间】:2017-03-15 09:27:44
【问题描述】:

我们有一个要求,如果满足某些条件,我需要强制注销用户。我写了一个PostLoginAction 钩子来检查条件并在满足条件时执行getSession().invalidate()。但在此之后,由于没有活动会话,Liferay 默认带我进入登录屏幕(prolly 使用过滤器)。如果我尝试重定向到 /ROOT/html/common/ 内的错误页面之一,我会得到一个神秘的 internal server error 页面。

此时,我需要显示一条错误消息,但所有重定向都在登录页面上结束。这样做的正确方法应该是什么?

顺便说一句,有没有办法在登录页面本身上显示错误消息,而不是重定向到其他页面?我已经尝试使用sessionErrors.add() 方法来实现相同的效果,但这也没有奏效。

如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 我说得对吗?您想在用户登录后立即注销用户吗?您能否添加您当前的PostLoginAction 以更好地解释问题?
  • 您是否尝试过在 liferay 中创建“login.events.pre”钩子并在操作类中使用户会话无效?
  • @TobiasLiefke - 我的代码几乎与下面的答案中给出的相似。
  • @ShivamAggarwal,我需要写一个登录后,因为我需要使用用户的 OrganizationId 来执行必要的检查。 PreLogin 操作不会触发 liferay 的身份验证机制,我将无法获取 User 对象(及其 OrganizationId )。

标签: liferay hook liferay-6 logout custom-error-pages


【解决方案1】:

请按照以下步骤实现此目标

  1. 创建一个登录后事件挂钩插件

  2. 使用给定的道具创建portal.properties

    login.events.post=com.liferay.sample.hook.LoginActionRedirect

  3. 在 liferay-hook.xml 中创建条目

    portal.properties

  4. 创建类 LoginActionRedirect

    package com.liferay.sample.hook;
    
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.liferay.portal.kernel.events.Action;
    import com.liferay.portal.kernel.events.ActionException;
    
    public class LoginActionRedirect extends Action {
    
    @Override
    public void run(HttpServletRequest req, HttpServletResponse res)
            throws ActionException {
        System.out.println("Invalidating user");
        req.getSession().invalidate();
        try {
            //Use page URL to be redirected
            res.sendRedirect(req.getContextPath()+"/web/guest/WCM");
        } catch (IOException e) {
    
            System.out.println("Something went wrong while performing IO operations");
        }
    }
    

    }

  5. 将以下属性添加到portal-ext.properties 文件中,以避免预先添加区域设置的重定向

    locale.prepend.friendly.url.style=0

【讨论】:

  • 这正是我正在做的事情,但我的问题是,是否将自定义 HTML 放在“/web/guest/WCM”下并执行 sendReirect 是否有有效/最佳方式来处理这种情况还是不行?
  • 我目前正在做 response.sendRedirect("/html/common/loginBreaker.html");我已经将该html放在了liferay安装的webapps/ROOT/html/common/文件夹下
  • @buch11 在门户上自定义创建的页面上使用 Web 内容是一种更好的方法,原因如下:1)在任何内容或页面更改的情况下无需重新启动服务器 2)可以轻松更改直接使用钩子从服务器部署或拉起。如有任何进一步的问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多