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

时间:2016-08-24 13:43:45

标签: jquery portlet

当用户点击"关闭"在我的portlet中链接,我需要将他注销并将其重定向到主页。它看起来似乎微不足道,但是当它变得棘手时我们正在使用:我们使用Portlets API,Struts 2和jQuery来组合页面。

所以从我的portlet的背景来看,我不能简单地引用该网站的根目录。

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

2 个答案:

答案 0 :(得分:1)

在开发portlet时,你无法通过API完成整页重定向 - 这是portlet API中的重点:作为一个portlet开发人员,你不知道你与谁共享页面,你很好屏蔽了HttpRequest。

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

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

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

答案 1 :(得分:0)

如果您使用的是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>