You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Liferay DXP 7.3中实现logoutpreaction和logoutpostaction及获取示例类

Liferay DXP 7.3 LogoutPreAction与LogoutPostAction实现方案

Liferay DXP 7.3中不需要修改portal-ext.properties注册事件,直接实现LifecycleAction接口并通过OSGi组件注解指定事件类型即可完成登出前后的自定义逻辑注入。

1. 登出前动作(LogoutPreAction)示例代码

该动作会在Liferay执行默认登出逻辑前触发,适合做登出前的状态校验、临时数据清理等操作。

import com.liferay.portal.kernel.events.LifecycleAction;
import com.liferay.portal.kernel.events.LifecycleEvent;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.util.WebKeys;
import org.osgi.service.component.annotations.Component;

import javax.servlet.http.HttpServletRequest;

@Component(
    immediate = true,
    property = {
        "key=logout.events.pre",
        "service.ranking:Integer=100"
    },
    service = LifecycleAction.class
)
public class CustomLogoutPreAction implements LifecycleAction {

    @Override
    public void processLifecycleEvent(LifecycleEvent lifecycleEvent) {
        HttpServletRequest request = lifecycleEvent.getRequest();
        // 获取当前待登出的用户对象
        User currentUser = (User) request.getAttribute(WebKeys.USER);
        if (currentUser == null) {
            return;
        }

        // 自定义业务逻辑示例:输出登出前日志
        System.out.printf("预登出:用户[%s],会话ID:%s%n",
            currentUser.getScreenName(),
            request.getSession().getId()
        );

        // 可在此添加自有业务逻辑:
        // - 校验用户未完成的操作
        // - 清理用户专属的临时缓存
        // - 记录登出审计日志
    }
}

2. 登出后动作(LogoutPostAction)示例代码

该动作会在Liferay完成默认登出逻辑(销毁会话、清除登录态)后触发,适合做登出后的跳转、第三方系统登出通知等操作。

import com.liferay.portal.kernel.events.LifecycleAction;
import com.liferay.portal.kernel.events.LifecycleEvent;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.util.WebKeys;
import org.osgi.service.component.annotations.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component(
    immediate = true,
    property = {
        "key=logout.events.post",
        "service.ranking:Integer=100"
    },
    service = LifecycleAction.class
)
public class CustomLogoutPostAction implements LifecycleAction {

    @Override
    public void processLifecycleEvent(LifecycleEvent lifecycleEvent) {
        HttpServletRequest request = lifecycleEvent.getRequest();
        HttpServletResponse response = lifecycleEvent.getResponse();

        User currentUser = (User) request.getAttribute(WebKeys.USER);
        if (currentUser != null) {
            // 自定义业务逻辑示例:输出登出完成日志
            System.out.printf("登出完成:用户[%s]%n", currentUser.getScreenName());
        }

        // 可在此添加自有业务逻辑:
        // - 跳转到自定义登出成功页
        // - 清除第三方系统的登录Cookie
        // - 调用其他业务系统的登出接口
        /*
        try {
            response.sendRedirect("/web/guest/logout-success");
        } catch (Exception e) {
            e.printStackTrace();
        }
        */
    }
}

注意事项

  • 组件的service属性必须指向com.liferay.portal.kernel.events.LifecycleAction,否则事件不会被Liferay识别
  • service.ranking属性用于调整执行优先级,数值越高的组件越先被执行
  • 编译模块时需要引入对应版本的Liferay内核依赖,Liferay DXP 7.3对应的com.liferay.portal.kernel版本为5.x系列
  • 代码部署为OSGi模块后自动生效,不需要重启整个Liferay服务

内容的提问来源于stack exchange,提问作者Shabeeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 16:51:03