如何将我的页面从我的 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 会自动将您重定向到登录页面。
当用户单击我的 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 会自动将您重定向到登录页面。