如何在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
相关产品推荐
相关产品推荐

