Liferay 7 中自定义登录后操作中的 LAST_PATH 重定向

Posted

技术标签:

【中文标题】Liferay 7 中自定义登录后操作中的 LAST_PATH 重定向【英文标题】:LAST_PATH Redirection in Custom Login Post Action in Liferay 7 【发布时间】:2018-05-05 02:55:25 【问题描述】:

我正在 Liferay 7 中实现自定义登录 - 一个用于登录挂钩 portlet 的模块,一个用于 ActionCommand。

我还为登录后事件生成了类。问题是重定向在此类或登录挂钩 porlet 的 JSP 上都不起作用。

这是我的 LifecycleAction 代码:

@Component(
    immediate = true,
    property = 
        "key=login.events.post"
    ,
    service = LifecycleAction.class
)
public class UserLoginPostAction implements LifecycleAction 

    private static final Log LOGGER = LogFactoryUtil.getLog(UserLoginActionCommand.class);

    @Override
    public void processLifecycleEvent(LifecycleEvent lifecycleEvent) throws ActionException    

        HttpServletRequest request = lifecycleEvent.getRequest();
        HttpServletResponse response = lifecycleEvent.getResponse();
        HttpSession session = request.getSession();

        try 
            User currentUser = PortalUtil.getUser(request);
            LOGGER.info("USER|" + currentUser.getFirstName() + "|" + currentUser.getGroup().toString());
            LOGGER.info("LASTPATH|" + session.getAttribute("LAST_PATH"));
            LastPath lastPath = (LastPath) session.getAttribute("LAST_PATH");
            LOGGER.info(lastPath.getPath());
            session.setAttribute(WebKeys.LAST_PATH, lastPath);
            response.sendRedirect(lastPath.getPath());
         catch (PortalException | IOException exception) 
            LOGGER.error(exception);
        
    


这是我的 porlet 登录 JSP 代码:

<c:choose>
    <c:when test="<%= themeDisplay.isSignedIn() %>">        
        <%
        response.sendRedirect(WebKeys.LAST_PATH);
        %>
    </c:when>
    <c:otherwise>
...

我的 LOGGER 能够在控制台上显示正确的值。

谢谢。

【问题讨论】:

【参考方案1】:

登录后的转发有点棘手。

如果您使用 LAST_PATH 和会话属性,则不需要发送重定向行,因为这将由 Liferay 处理。最后一个路径可能会受到 URL 参数的影响,如“重定向”。

如果您要使用发送重定向方法。构建您的 URL,然后将您创建的 URL 传递给 sendRedirect() 调用。不要使用 session 参数。

PS:如果您正在修改登录,请查看 AuthPipeline,而不是对登录 portlet 进行大量覆盖。

【讨论】:

与重定向一样,我的隐藏输入字段没有任何价值。我尝试手动为其赋值,当我登录时,它成功重定向到页面。我有点困惑它如何获得它的价值。参数重定向在哪里获取其值,以便重定向的隐藏输入具有该值? 与 LAST_PATH 一样,如果您可以看到我上面的代码,我将 WebKeys.LAST_PATH 设置为会话。我删除了 sendRedirect。但是,它也不会。您能给我登录 portlet/jsp 和登录帖子的示例吗?还是我错过了什么?谢谢。 我还尝试将 saveLastPath 隐藏输入的值设置为 true 并删除/放回重定向输入。它没有用。 你不应该在这两个地方都有重定向。行动是解决这个问题的正确地方。隐藏字段由 javascript 从提供的数据和已知数据中填充。重定向参数由源端设置,因此如果您不是来自设置它的应用程序,则不会填充它。【参考方案2】:

在 Liferay DXP / 7+ 中通过页面重定向发布登录挂钩:

@Component(immediate = true, property =  "key=login.events.post" , service = LifecycleAction.class)
public class CustomLoginAction implements LifecycleAction  
private static final Log _log = LogFactoryUtil.getLog(CustomLoginAction.class);

    @Reference
    private Portal _portal;
    
    @Override
    public void processLifecycleEvent(LifecycleEvent lifecycleEvent) throws ActionException 
        HttpServletRequest httpServletRequest = lifecycleEvent.getRequest();
        HttpSession httpSession = httpServletRequest.getSession();
        LastPath lastPath = null;
        try 
            User user = _portal.getUser(request);
            String redirectPath = null;
            if(user.getEmailAddress().startsWith("test")) 
                redirectPath = "/group/guest/home";
            else
                redirectPath = "/group/guest/welcome";
            
            lastPath = new LastPath("",redirectPath);
         catch (Exception e) 
            _log.error(e.getMessage(), e);
        
        if(Validator.isNotNull(lastPath)) 
            httpSession.setAttribute(WebKeys.LAST_PATH, lastPath);
        
    

【讨论】:

以上是关于Liferay 7 中自定义登录后操作中的 LAST_PATH 重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Liferay 7.0 中替换登录 portlet?

将 portlet 移动到 liferay 7 中的控制面板部分?

在 osgi 文件夹中复制后,Liferay 7 tomcat 中的战争在哪里爆炸

liferay 7 - 不匹配的匿名定义()

iOS 7 中自定义 TableViewCell 中的自动布局问题

Liferay 7.4 OpenID Connect 作为 Azure B2C 的 SP