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

标签 liferay portlet

我的意图是处理为资源(动态生成的 PDF)提供服务的 ResourceRequest。如果生成此文件时出现问题,则应呈现 portlet 中带有失败消息的整个门户。

是否可以将 ResourceRequest 转发到呈现完整门户的请求?我也在考虑重定向,但我希望能够传递一些属性/参数。

我希望我已经足够清楚地解释了我的问题。谢谢。

相关/重复:How to make the ResourceResponse to forward the request to error page in liferay portlet

例子

这是一个有效的示例,它的作用与我想要实现的目标类似。我使用 Liferay 的实用程序类 SessionErrors:serveResource() 在 session 中保存一个对象并重定向到呈现 URL。 doView()方法在后续请求中被调用,可以读取session中保存的内容。

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);
    }
}

我想要实现的是一样的,但是阻止浏览器做两个请求。为此,我想做一个转发,我应该将错误消息写为请求属性。

我将带有此示例的项目上传到 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 中的 Portlet 导航

themes - 是否可以将 Liferay 的版本号传递到主题的 Velocity 模板中?

java - 获取登录liferay门户的用户的用户凭据

selenium - 使用 Selenium 测试 Liferay 门户

java - 带有 gradle 的 NoClassDefFounderror 异常

java - 无法使用搜索工具在 liferay portlet 中搜索期刊文章

自定义 portlet 的 Selenium 测试

java - 删除 liferay 中的批准选项

Spring portlet mvc 提交编辑表单期间验证失败

java - Portlet 中的保存和加载操作 - jsp 文件找不到该文件