当用户点击"关闭"在我的portlet中链接,我需要将他注销并将其重定向到主页。它看起来似乎微不足道,但是当它变得棘手时我们正在使用:我们使用Portlets API,Struts 2和jQuery来组合页面。
所以从我的portlet的背景来看,我不能简单地引用该网站的根目录。
一旦我点击关闭(使用操作),我设法使会话无效,如何将整个页面(由不同的portlet组成)重定向到主页?
答案 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>