[ https://issues.apache.org/struts/browse/WW-1831?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
James Holmes reassigned WW-1831: -------------------------------- Assignee: James Holmes > Common use case for stranded messages in MessageStoreInterceptor > ----------------------------------------------------------------- > > Key: WW-1831 > URL: https://issues.apache.org/struts/browse/WW-1831 > Project: Struts 2 > Issue Type: Improvement > Components: Interceptors > Affects Versions: 2.0.6 > Reporter: Jasper Rosenberg > Assignee: James Holmes > Fix For: Future > > > I have what I think would be a pretty common use case for the > MessageStoreInterceptor where, under some circumstances, messages could be > left in the session, taking up memory unncessarily. > The sample use case is that when someone submits an email change, on success > I want to redirect them back to their home action, passing any messages (i.e. > "Your email has been successfully changed") along for display. I used to do > this with action chaining which worked but was sub-optimal since the user > would end up back at their home page with an url like "updateEmail.action" > rather than "home.action". > MessageStoreInterceptor seems like the right solution for this case as now I > can have the updateEmail store the message, redirect to the home page, and > then have home page retrieve it: > <action name="home" > class="com.mycompany.action.HomeAction"> > <result>home.ftl</result> > <interceptor-ref name="store"> > <param name="operationMode">RETRIEVE</param> > </interceptor-ref> > <interceptor-ref name="basicStack"/> > </action> > <action name="updateEmail" > class="com.mycompany.action.ChangeEmailAction" method="updateEmail"> > <result type="redirect-action"> > <param name="actionName">home</param> > </result> > <result name="input">editEmail.ftl</result> > <interceptor-ref name="store"> > <param name="operationMode">STORE</param> > </interceptor-ref> > <interceptor-ref name="validationStack"/> > </action> > The problem is the case when the result of updateEmail is "input" rather than > "success". In this case, I just redisplay the change email form, but any > validation errors will have been stored in the session. If the user then > navigates away or closes the browser, these messages will be stranded in the > session. > I think there is a pretty simple fix for this: > In MessageStoreInterceptor.before(), simply move the lines: > session.remove(actionErrorsSessionKey); > session.remove(actionMessagesSessionKey); > session.remove(fieldErrorsSessionKey); > out of the nested ifs so that they are always the last operations in the > method. > This will handle any case other than a redirect/chain to an action that > doesn't have the interceptor at all (which can't be helped). > Another option to this is to explictly support an additional parameter for > the Interceptor like "clearStoredMessages" which defaults to false, but if > true always calls the session.remove()s at the end of the before(). -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.