portals-pluto-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David H. DeWolf" <ddew...@apache.org>
Subject Re: PLUTO 1.1 Problem: Cross context: where is the session?
Date Mon, 05 Sep 2005 03:03:54 GMT
you're right, something is definitely wrong.

What should happen is that all portlet's utilize the session associated 
with the portlet (web) app within which it's deployed.

In your example - the portlet should always utilize the session bound to 
/toto

Pluto depends highly upon the servlet container for this functionality. 
  In fact, it violates the servlet spec to make the /pluto session 
available in a target resource of a cross context dispatch.

Hope that helps,

David

Zhong ZHENG wrote:
> Hi, there,
> 
> I got a problem using Pluto 1.1: since Pluto uses cross context to 
> invoke portlets, if I try to retrieve a portlet session from the portlet 
> request, which servlet context is this portlet session bound to?
> 
> Well, here is a simple scenario: I am writing a portlet app with a 
> single portlet. This app will be deployed to the context path, for 
> example, '/toto'. In the portlet, render() method retrieves an attribute 
> from portlet session using key X, prints the value on the page, and 
> provides a link to the action URL. The processAction() method sets the 
> value of attribute X in the portlet session.
> 
> Here comes the problem: when the action URL is triggered, the 
> processAction() method runs well, BUT! When the portlet is rendered, the 
> render() method fails to find the attribute.
> 
> If I don't use cross context, which is to say, if I put the toto portlet 
> app into the portal driver webapp, the portlet runs perfectly.
> 
> I tried to trace the error, and found that the processAction() and 
> render() DID NOT use the same portlet session: during the action 
> processing, the portlet session was bound to servlet context '/pluto' 
> (whose name was Pluto Reference Implementation), but during the render 
> processing, the portlet session was bound to the context '/toto'. That's 
> why render() method failed to retrieve the session: It created a new one 
> with no attributes inside.
> 
> To find more details on the problem, I checked the source code. In the 
> class PortletRequestImpl:
> 
>     public PortletSession getPortletSession(boolean create) {
>       
>         // check if the session was invalidated
> 
>         // HERE!! The HttpSession is retrieved successfully,
>         // but they are different for render() and processAction() methods!
>         HttpSession httpSession = this.getHttpServletRequest()
>             .getSession(false);
>        
>         // I Debugged the name of servlet context, and they are different!
>         if (httpSession != null) {
>             javax.servlet.ServletContext servletContext = 
> httpSession.getServletContext();
>             LOG.info("Servlet context name: " + 
> servletContext.getServletContextName());
>         }
>         if ((portletSession != null) && (httpSession == null)) {
>             portletSession = null;
>         } else if (httpSession != null) {
>             create = true;
>         }
> 
>         if (create && portletSession == null) {
>             httpSession = this.getHttpServletRequest().getSession(create);
>             if (httpSession != null) {
>                 portletSession =
>                 new PortletSessionImpl(context, internalPortletWindow,
>                                        httpSession);
>             }
>         }
> 
>         return portletSession;
>     }
> 
> 
> So I would like to ask you: If we use cross context, which servlet 
> context should the portlet sessions be bound to? The portal webapp or my 
> portlet app?
> 
> Anyway, we should use the same portlet session for both processAction() 
> and render(), shouldn't we? So, is this a bug?
> 
> I also tried to find out why the sessions are different for 
> processAction() and render(). I found that before the PortletInvoker 
> calls dispatcher.dispatch(request, response) to dispatch the request and 
> response to /toto/PlutoInvoker/MyPortlet and pass the control to 
> PortletServlet, the two methods work all the same. But when 
> PortletServlet.dispatch() is called, they already behave differently: I 
> inserted some debug codes at the begining of PortletServlet.dispatch() 
> method, as the following:
> 
> LOG.debug("Servlet context name: " + ((PortletRequestImpl) request)
>         .getHttpServletRequest()
>         .getSession()
>         .getServletContext()
>         .getServletContextName());
> 
> For portlet action requests, this code prints "Pluto Reference 
> Implementation", while for rendering requests, " My Portlet App" is printed.
> 
> So I wonder if that is a problem of Tomcat?
> 
> BTW, I am using Tomcat 5.5.9 + JDK 1.4.1_05-b01
> 
> I would appreciate your response. Thanks in advance.
> 
> Regards.
> 
> -- 
> 
> ZHENG Zhong
> 
> 1 Avenue Alphand
> 75116 Paris, France
> +33 6 76 80 45 90
> 
> heavyzheng {AT} gmail {D0T} com
> 
> http://heavyz.sourceforge.net
> http://heavyz.blogspot.com
> http://spaces.msn.com/members/zhengzhong
> 
> 


Mime
View raw message