SPR-8997 Add HttpServletResponse to FlashMapManager contract.

This change makes the HttpServletResponse available to the methods
of FlashMapManager in addition to the HttpServletRequest.
This commit is contained in:
Rossen Stoyanchev
2012-01-10 10:47:47 -05:00
parent 66df039b03
commit 92f8446eea
5 changed files with 58 additions and 37 deletions

View File

@@ -815,7 +815,7 @@ public class DispatcherServlet extends FrameworkServlet {
}
}
this.flashMapManager.requestStarted(request);
this.flashMapManager.requestStarted(request, response);
// Make framework objects available to handlers and view objects.
request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
@@ -827,7 +827,7 @@ public class DispatcherServlet extends FrameworkServlet {
doDispatch(request, response);
}
finally {
this.flashMapManager.requestCompleted(request);
this.flashMapManager.requestCompleted(request, response);
// Restore the original attribute snapshot, in case of an include.
if (attributesSnapshot != null) {

View File

@@ -63,6 +63,8 @@ public final class FlashMap extends HashMap<String, Object> implements Comparabl
/**
* Create a new instance with an id uniquely identifying the creator of
* this FlashMap.
* @param createdBy identifies the FlashMapManager instance that created
* and will manage this FlashMap instance (e.g. via a hashCode)
*/
public FlashMap(int createdBy) {
this.createdBy = createdBy;

View File

@@ -17,6 +17,7 @@
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* A strategy interface for storing, retrieving, and managing {@code FlashMap}
@@ -64,8 +65,9 @@ public interface FlashMapManager {
* <li>Clean expired FlashMap instances.
* </ol>
* @param request the current request
* @param response the current response
*/
void requestStarted(HttpServletRequest request);
void requestStarted(HttpServletRequest request, HttpServletResponse response);
/**
* Start the expiration period of the "output" FlashMap save it in the
@@ -73,7 +75,8 @@ public interface FlashMapManager {
* <p>The "output" FlashMap should not be saved if it is empty or if it was
* not created by the current FlashMapManager instance.
* @param request the current request
* @param response the current response
*/
void requestCompleted(HttpServletRequest request);
void requestCompleted(HttpServletRequest request, HttpServletResponse response);
}

View File

@@ -22,6 +22,7 @@ import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
@@ -64,7 +65,7 @@ public class DefaultFlashMapManager implements FlashMapManager {
* {@inheritDoc}
* <p>An HTTP session is never created by this method.
*/
public void requestStarted(HttpServletRequest request) {
public final void requestStarted(HttpServletRequest request, HttpServletResponse response) {
if (request.getAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE) != null) {
return;
}
@@ -164,9 +165,9 @@ public class DefaultFlashMapManager implements FlashMapManager {
}
/**
* Iterate all flash maps and remove expired ones.
* Check and remove expired FlashMaps instances.
*/
private void removeExpiredFlashMaps(HttpServletRequest request) {
protected void removeExpiredFlashMaps(HttpServletRequest request) {
List<FlashMap> allMaps = retrieveFlashMaps(request, false);
if (CollectionUtils.isEmpty(allMaps)) {
return;
@@ -189,7 +190,7 @@ public class DefaultFlashMapManager implements FlashMapManager {
* {@inheritDoc}
* <p>An HTTP session is never created if the "output" FlashMap is empty.
*/
public void requestCompleted(HttpServletRequest request) {
public void requestCompleted(HttpServletRequest request, HttpServletResponse response) {
FlashMap flashMap = (FlashMap) request.getAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE);
if (flashMap == null) {
throw new IllegalStateException("requestCompleted called but \"output\" FlashMap was never created");
@@ -198,24 +199,35 @@ public class DefaultFlashMapManager implements FlashMapManager {
if (logger.isDebugEnabled()) {
logger.debug("Saving FlashMap=" + flashMap);
}
onSaveFlashMap(flashMap, request);
retrieveFlashMaps(request, true).add(flashMap);
onSaveFlashMap(flashMap, request, response);
saveFlashMap(flashMap, request, response);
}
}
/**
* Update a FlashMap before it is stored in the HTTP Session.
* Update a FlashMap before it is stored in the underlying storage.
* <p>The default implementation starts the expiration period and ensures the
* target request path is decoded and normalized if it is relative.
* @param flashMap the flash map to be saved
* @param request the current request
* @param response the current response
*/
protected void onSaveFlashMap(FlashMap flashMap, HttpServletRequest request) {
protected void onSaveFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response) {
String targetPath = flashMap.getTargetRequestPath();
flashMap.setTargetRequestPath(decodeAndNormalizePath(targetPath, request));
flashMap.startExpirationPeriod(this.flashTimeout);
}
/**
* Save the FlashMap in the underlying storage.
* @param flashMap the FlashMap to save
* @param request the current request
* @param response the current response
*/
protected void saveFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response) {
retrieveFlashMaps(request, true).add(flashMap);
}
private String decodeAndNormalizePath(String path, HttpServletRequest request) {
if (path != null) {
path = this.urlPathHelper.decodeRequestString(request, path);