我的意图是处理为资源(动态生成的 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/