如何将我的页面从我的 portlet 重定向到网站的根目录?

How can I redirect my page to the root of the website from my portlet?

当用户单击我的 portlet 中的 "close" link 时,我需要将他注销并将他重定向到主页。它看起来确实微不足道,但这里是它变得棘手的时候:我们正在使用 Portlets API、Struts 2 和 jQuery 来编写页面。

所以从我的 portlet 的上下文来看,我不能简单地引用网站的根目录。

单击关闭(使用操作)后我设法使会话无效,如何将整个页面(由不同的 portlet 组成)重定向到主页?

如果您正在使用 Struts2,您可以添加一个拦截器,在每个操作之前检查是否有登录用户,如果没有登录用户,则重定向到全局结果。

public class LoginInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        if (invocation.getInvocationContext().getSession().get(Const.USER) != null) {
            return invocation.invoke();
        }
        else {
            return "globalLogin";
        }
    }

}

将拦截器添加到struts.xml

中的拦截器堆栈
<interceptors>
    <interceptor name="loginInterceptor" class="business.interceptor.LoginInterceptor"/>
        <interceptor-stack name="loginStack">
            <interceptor-ref name="loginInterceptor"/>
            <interceptor-ref name="defaultStack" />
        </interceptor-stack>
    </interceptors>

然后把它放在你的 struts.xml 中,重定向到你的主要操作(显示主页的那个)

<global-results>
    <result name="globalLogin" type="redirectAction">
        <param name="actionName">main</param>
    </result>
</global-results>

开发 portlet 时,您不能通过 API 进行整页重定向 - 这就是 portlet API 的要点:作为 portlet 开发人员,您不知道自己是谁与共享页面,并且您可以很好地免受 HttpRequest 的影响。

门户网站可能已经开始发送回响应 - 因此发送重定向响应代码为时已晚。它可能已决定利用 Ajax 传送您的 portlet 的 HTML 片段。这也可能不会导致预期的行为。

我看到的这种重定向的一种(非合作)方式是生成 Javascript 代码,在页面呈现时重定向该页面。为什么不合作?好吧:每个单独的 portlet 都可能生成这样的代码,但自然只有第一个 portlet 获胜。哪个是第一个?不明确的。如果整个页面在单个文档中呈现,它可能是页面上的第一个。如果 portlet 是通过 Ajax 单独交付的:谁知道呢。

但是,如果您注销某人(您也可能以非标准方式执行此操作,不能保证有效),您可能只是将您所在的页面配置为私有,例如需要登录。然后 Liferay 会自动将您重定向到登录页面。