Hi Marton. Yes, you need to explicitly call setAttribute() when you modify any object in the session. Otherwise, the object won't be updated in App Engine's cache/datastore, which are the mechanisms it uses to back sessions - Jason
On Thu, Sep 3, 2009 at 2:11 AM, Marton Papp <mapr...@gmail.com> wrote: > > Hi! > > I am using HttpSession to store some information as session > attributes. When I am testing the application locally, it works fine. > But when I upload it to production, it seems that any session > attributes that I retrieve from the session and modify it are not > persisted back to the session again, unless I specifically call > HttpSession.setAttribute() in each request. I am not sure whether it > is the expected behavior or it is bug. Here are the two test cases: > > Test1: > > public class Test_gae_sessionServlet extends HttpServlet { > private static final String SESSION_ATTRIBUTE_NAME = > "test_session_attribute"; > > public void doGet(HttpServletRequest req, HttpServletResponse resp) > throws IOException { > HttpSession session = req.getSession(); > resp.setContentType("text/plain"); > > SessionContext sessionContext = (SessionContext) > session.getAttribute > (SESSION_ATTRIBUTE_NAME); > > resp.getWriter().println("session retreived: " + > sessionContext); > > if (sessionContext==null) { > sessionContext = new SessionContext(); > resp.getWriter().println("session created: " + > sessionContext); > > // calling setAttribute only when the object is > first created > resp.getWriter().println("putting context into > session: " + > sessionContext); > session.setAttribute(SESSION_ATTRIBUTE_NAME, > sessionContext); > } > > sessionContext.value++; > > resp.getWriter().println("context at end of retquest: " + > sessionContext); > } > } > > > Test2: > > public class Test_gae_sessionServlet extends HttpServlet { > private static final String SESSION_ATTRIBUTE_NAME = > "test_session_attribute"; > > public void doGet(HttpServletRequest req, HttpServletResponse resp) > throws IOException { > HttpSession session = req.getSession(); > resp.setContentType("text/plain"); > > SessionContext sessionContext = (SessionContext) > session.getAttribute > (SESSION_ATTRIBUTE_NAME); > > resp.getWriter().println("session retreived: " + > sessionContext); > > if (sessionContext==null) { > sessionContext = new SessionContext(); > resp.getWriter().println("session created: " + > sessionContext); > } > > // calling setAttribute in every request > resp.getWriter().println("putting context into session: " + > sessionContext); > session.setAttribute(SESSION_ATTRIBUTE_NAME, > sessionContext); > > sessionContext.value++; > > resp.getWriter().println("context at end of retquest: " + > sessionContext); > } > } > > > The object stored in the session: > > public class SessionContext implements Serializable { > > private static final long serialVersionUID = -5151175222401820614L; > > public int value = 0; > > @Override > public String toString() { > return "SessionContext [value=" + value + "]"; > } > > } > > > In Test1 it is always the first version of the SessionContext that is > retreived in each request, no matter that I try to change its contents > during each request. Test2 works as expected. Is it so that I need to > call HttpSession.setAttribute() for any object that is expected to > change during the request? Is it according to the servlet > specification? > > > Marton > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---