我需要制作一个 Servlet 来管理一些信息,然后,将转到 Liferay 6.2 Portlet。两者都在同一服务器中。
我需要Servlet发送参数,但我不想发送GET,而是发送POST方法。因此,我尝试将其放入 session 中以从 Portlet 中检索它。
在 Servlet 中,我有:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
request.getSession().setAttribute("param1", "TEST 1");
url = "http://myServer/";
response.sendRedirect(response.encodeRedirectURL(url));
} catch (Exception e) {
e.printStackTrace();
}
}
在 Portlet 中,我在渲染方法中管理信息,因为我想在渲染页面之前获取 param1:
public void render (RenderRequest renderRequest, RenderResponse renderResponse)
throws PortletException, IOException {
super.render(renderRequest, renderResponse);
//Try to retrieve from getOriginalServletRequest
HttpServletRequest servletReq = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(renderRequest));
String param1 = servletReq.getSession().getAttribute("param1").toString();
//Try to retrieve from getHttpServletRequest
HttpServletRequest servletReq_ = PortalUtil.getHttpServletRequest(renderRequest);
String param1_ = servletReq_.getSession().getAttribute("param1").toString();
}
如您所见,我尝试从 getHttpServletRequest 和 getOriginalServletRequest 检索,但我总是得到 param1 null。
有什么建议吗? 预先感谢您!
更新问题:
我被第三方调用,并且我收到了一个我想要评估的 GET 参数。
之后,我想重定向到一个或另一个 Portlet,而不是在中间渲染页面,具体取决于该评估。
我需要向这些Portlet发送一些个人信息,所以我想在POST方法中发送一些参数。
Servlet 不适合,因为它不与 Portlet 共享 session 。
我尝试实现一个登陆Portlet,但是重定向只能在操作阶段完成,所以我需要在重定向之前渲染一个(空)页面,不喜欢那部分。渲染阶段不允许重定向(即使获取 PortalUtil.getHttpServletResponse(),也不起作用)
有什么建议吗?谢谢!
最佳答案
servlet 和 portlet 不会共享同一个 session 。 Portlet 位于门户服务器内,例如莱弗雷。 Servlet 通常位于其自己的 Web 应用程序中,因此在设计上完全分离。
如果您需要在两者之间进行通信,这里有两种可能的解决方案/解决方法:
- 将 servlet 重新实现为 portlet,可能会利用 portlet 的资源阶段
- 使用请求参数而不是 session 属性
在所有评论后编辑:
似乎最好退一步看看根本问题 - 您真正想要解决的问题是什么?您问题的内容是您如何尝试解决它,显然存在挑战。看起来这个问题首先需要一个不同的解决方案。
我的回答描述了为什么您的解决方案不起作用,但这显然无助于解决根本问题。
关于java - 使用 session 将参数发送到 Liferay Portlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769846/