portlet会话中的属性集在servlet会话中不可用

时间:2015-01-06 21:10:29

标签: java tomcat servlets portlet

在Liferay论坛上发帖:https://www.liferay.com/community/forums/-/message_boards/message/47412302

我在JSR-286 portlet中有一个简单的应用程序设置,用于从Portlet session.attribute

中检索值

doView()方法:

public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
     throws PortletException, IOException
   {
     renderResponse.setContentType("text/html");
     getFormBean(renderRequest.getPortletSession());
     PortletURL renderUrl = renderResponse.createRenderURL();
     renderUrl.setWindowState(WindowState.MAXIMIZED);
     PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher(this.viewUrl);
     dispatcher.include(renderRequest, renderResponse);
   }

我在这里设置我的属性 TestPortlet.java:

private void getFormBean(PortletSession session)
{
    String testVar = (String)session.getAttribute("testAttr", 1);
    if (null == testVar) {
        System.out.println("Setting Attribute inside Portlet");
        session.setAttribute("testAttr", "TESTING SESSION", 1);
    }
}

并在TestServlet.java(相同的包)中检索此属性:

private void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
         String testVal = (String) request.getSession(true).getAttribute("testAttr");
         System.out.println("Test Attribute from Servlet:"+testVal);
}

应用程序的输出返回null

Setting Attribute in Portlet
Test Attribute from Servlet:null

输出应为:

Test Attribute from Servlet:TESTING SESSION

此应用程序 在我的本地设置上运行 ,但不是在具有几乎相同配置的远程服务器上。 我已经在我的tomcat / lib中包含了javax-servlet-api-3.1.0以检索HttpServletRequest类,但是找不到其他可能缺失的内容。我还没有看到任何Exceptions / ClassNotFound错误。

是否存在可能干扰会话的任何类型的服务器配置? (身份验证,网络配置,安全性)

本地设置

  • Tomcat 7.0.33
  • jdk-1.7(用1.6和1.7编译)

远程设置

  • Tomcat 7.0.33
  • Apache Web服务器
  • jdk-1.6.0u35
  • / lib(jdbc驱动程序等)中的更多jar文件

1 个答案:

答案 0 :(得分:1)

如果要在同一个应用程序(war)中共享portlet和servlet之间的会话数据,则必须将该属性放在应用程序范围内,如下所示:

portletSession.setAttribute("testAttr", "TESTING SESSION", PortletSession.APPLICATION_SCOPE); 

然后还使用范围在portlet中检索它:

portletSession.getAttribute("testAttr", PortletSession.APPLICATION_SCOPE);