liferay - Portlet:转发ResourceRequest以显示完整的门户

原文 标签 liferay portlet

我的意图是处理为资源提供服务的ResourceRequest(以动态方式生成的PDF)。如果在生成此文件时出现问题,则应呈现整个门户,并在portlet中显示失败消息。
是否可以将ResourceRequest转发到呈现完整门户的请求?我也在考虑重定向,但是我希望能够传递一些属性/参数。
我希望我的问题解释得足够清楚。谢谢。
相关/重复的:How to make the ResourceResponse to forward the request to error page in liferay portlet

这是一个有效的示例,其功能与我想要实现的功能类似。我使用Liferay的实用程序类SessionErrors:serveResource()将对象保存在会话中,并重定向到渲染URL。在后续请求期间将调用doView()方法,该方法可以读取会话中保存的内容。

import com.liferay.portal.kernel.servlet.SessionErrors;
import javax.portlet.GenericPortlet;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;

public class ResourceRequestForwardPortlet extends GenericPortlet {

    public void serveResource(ResourceRequest request, ResourceResponse response)
        throws PortletException, IOException {

        SessionErrors.add(resourceRequest, "resourcerequest.error", "ERROR " + errorText);

        resourceResponse.setProperty(ResourceResponse.HTTP_STATUS_CODE, "302");
        resourceResponse.addProperty("Location", resourceResponse.createRenderURL().toString());
    }

    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        String error = (String)SessionErrors.get(renderRequest, "resourcerequest.error");
        SessionErrors.clear(renderRequest);
            
        renderRequest.setAttribute("errorMsg", error);

        PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher("view.jsp");
        include(viewTemplate, renderRequest, renderResponse);
        portletRequestDispatcher.include(renderRequest, renderResponse);
    }
}
我想要实现的是相同的,但是阻止浏览器执行两个请求。为此,我想进行转发,并且应该将错误消息写为request属性。
我将带有此示例的项目上传到GitHub:
https://github.com/adrianrm/poc-forward-portlet/tree/master/src/main/java/arm/requestforward

最佳答案

以下是尝试使用servlet向前进行的尝试,并且似乎可行。不过,我认为这是Portlet规范中不存在的功能的解决方法:

public class ResourceRequestForwardPortlet extends GenericPortlet {

    public void serveResource(ResourceRequest request, ResourceResponse response)
        throws PortletException, IOException {

        HttpServletRequest request = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(portletRequest));
        PortletURL renderURL = portletResponse.createRenderURL();
        try {
            request.setAttribute("error", errorText);

            String forwardURL = renderURL.toString().replace("http://localhost:8080", "");//The generation of the forwardURL could be done nicer
            RequestDispatcher rd = request.getRequestDispatcher(forwardURL);
            rd.forward(request, PortalUtil.getHttpServletResponse(portletResponse));
        } catch (ServletException e) {
            throw new PortletException(e);
        }
    }
}

最重要的是,当发生转发时,Liferay在控制台上显示警告:
14:33:51,048 WARN  [http-apr-8080-exec-112][code_jsp:128] {code="404", msg="/poc-forward-portlet/web/guest/home", uri=/web/guest/home}
X-Requested-With null

关于liferay - Portlet:转发ResourceRequest以显示完整的门户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843877/

相关文章:

liferay - 在Liferay中设置虚拟主机的利弊是什么?

liferay - 如何在Liferay中为自定义实体创建监听器?

java - Liferay:用户特定的Portlet首选项

java - 是否提供了在诸如Liferay的JSR 286 Portlet容器中使用并发后台进程的规定?

javascript - 使用html和Javascript选择国家和州

java - 用Liferay进行网页设计

java - 后退按钮后,portlet不会进入processaction

java - 在 Java Portlet 中获取用户角色

java - 未设置PluginsSDK的SDK名称?

java - 在doView()上编辑响应内容