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 中的战争在哪里爆炸