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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-appengine-java?hl=en
-~----------~----~----~----~------~----~------~--~---