|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2012 the original author or authors. |
|
|
|
|
* Copyright 2002-2014 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -20,12 +20,12 @@ import java.util.ArrayList;
@@ -20,12 +20,12 @@ import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.concurrent.CopyOnWriteArrayList; |
|
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
|
|
|
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
|
|
|
|
|
|
import org.springframework.util.Assert; |
|
|
|
|
import org.springframework.util.CollectionUtils; |
|
|
|
|
import org.springframework.util.MultiValueMap; |
|
|
|
|
@ -43,13 +43,14 @@ import org.springframework.web.util.UrlPathHelper;
@@ -43,13 +43,14 @@ import org.springframework.web.util.UrlPathHelper;
|
|
|
|
|
*/ |
|
|
|
|
public abstract class AbstractFlashMapManager implements FlashMapManager { |
|
|
|
|
|
|
|
|
|
private static final Object writeLock = new Object(); |
|
|
|
|
|
|
|
|
|
protected final Log logger = LogFactory.getLog(getClass()); |
|
|
|
|
|
|
|
|
|
private int flashMapTimeout = 180; |
|
|
|
|
|
|
|
|
|
private UrlPathHelper urlPathHelper = new UrlPathHelper(); |
|
|
|
|
|
|
|
|
|
private static final Object writeLock = new Object(); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Set the amount of time in seconds after a {@link FlashMap} is saved |
|
|
|
|
@ -82,16 +83,16 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
@@ -82,16 +83,16 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
|
|
|
|
|
return this.urlPathHelper; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public final FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response) { |
|
|
|
|
|
|
|
|
|
public final FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response) { |
|
|
|
|
List<FlashMap> maps = retrieveFlashMaps(request); |
|
|
|
|
if (CollectionUtils.isEmpty(maps)) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (logger.isDebugEnabled()) { |
|
|
|
|
logger.debug("Retrieved FlashMap(s): " + maps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<FlashMap> mapsToRemove = getExpiredFlashMaps(maps); |
|
|
|
|
|
|
|
|
|
FlashMap match = getMatchingFlashMap(maps, request); |
|
|
|
|
@ -156,21 +157,20 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
@@ -156,21 +157,20 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Whether the given FlashMap matches the current request. |
|
|
|
|
* The default implementation uses the target request path and query |
|
|
|
|
* parameters saved in the FlashMap. |
|
|
|
|
* Uses the expected request path and query parameters saved in the FlashMap. |
|
|
|
|
*/ |
|
|
|
|
protected boolean isFlashMapForRequest(FlashMap flashMap, HttpServletRequest request) { |
|
|
|
|
if (flashMap.getTargetRequestPath() != null) { |
|
|
|
|
String expectedPath = flashMap.getTargetRequestPath(); |
|
|
|
|
if (expectedPath != null) { |
|
|
|
|
String requestUri = this.urlPathHelper.getOriginatingRequestUri(request); |
|
|
|
|
if (!requestUri.equals(flashMap.getTargetRequestPath()) |
|
|
|
|
&& !requestUri.equals(flashMap.getTargetRequestPath() + "/")) { |
|
|
|
|
if (!requestUri.equals(expectedPath) && !requestUri.equals(expectedPath + "/")) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
MultiValueMap<String, String> targetParams = flashMap.getTargetRequestParams(); |
|
|
|
|
for (String paramName : targetParams.keySet()) { |
|
|
|
|
for (String targetValue : targetParams.get(paramName)) { |
|
|
|
|
if (!ObjectUtils.containsElement(request.getParameterValues(paramName), targetValue)) { |
|
|
|
|
for (String expectedName : targetParams.keySet()) { |
|
|
|
|
for (String expectedValue : targetParams.get(expectedName)) { |
|
|
|
|
if (!ObjectUtils.containsElement(request.getParameterValues(expectedName), expectedValue)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -185,18 +185,16 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
@@ -185,18 +185,16 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
|
|
|
|
|
|
|
|
|
|
String path = decodeAndNormalizePath(flashMap.getTargetRequestPath(), request); |
|
|
|
|
flashMap.setTargetRequestPath(path); |
|
|
|
|
|
|
|
|
|
decodeParameters(flashMap.getTargetRequestParams(), request); |
|
|
|
|
|
|
|
|
|
if (logger.isDebugEnabled()) { |
|
|
|
|
logger.debug("Saving FlashMap=" + flashMap); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
flashMap.startExpirationPeriod(this.flashMapTimeout); |
|
|
|
|
|
|
|
|
|
synchronized (writeLock) { |
|
|
|
|
List<FlashMap> allMaps = retrieveFlashMaps(request); |
|
|
|
|
allMaps = (allMaps == null) ? new CopyOnWriteArrayList<FlashMap>() : allMaps; |
|
|
|
|
allMaps = (allMaps != null ? allMaps : new CopyOnWriteArrayList<FlashMap>()); |
|
|
|
|
allMaps.add(flashMap); |
|
|
|
|
updateFlashMaps(allMaps, request, response); |
|
|
|
|
} |
|
|
|
|
@ -217,7 +215,9 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
@@ -217,7 +215,9 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
|
|
|
|
|
private void decodeParameters(MultiValueMap<String, String> params, HttpServletRequest request) { |
|
|
|
|
for (String name : new ArrayList<String>(params.keySet())) { |
|
|
|
|
for (String value : new ArrayList<String>(params.remove(name))) { |
|
|
|
|
params.add(name, this.urlPathHelper.decodeRequestString(request, value)); |
|
|
|
|
name = this.urlPathHelper.decodeRequestString(request, name); |
|
|
|
|
value = this.urlPathHelper.decodeRequestString(request, value); |
|
|
|
|
params.add(name, value); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -228,7 +228,7 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
@@ -228,7 +228,7 @@ public abstract class AbstractFlashMapManager implements FlashMapManager {
|
|
|
|
|
* @param request the current request |
|
|
|
|
* @param response the current response |
|
|
|
|
*/ |
|
|
|
|
protected abstract void updateFlashMaps(List<FlashMap> flashMaps, HttpServletRequest request, |
|
|
|
|
HttpServletResponse response); |
|
|
|
|
protected abstract void updateFlashMaps( |
|
|
|
|
List<FlashMap> flashMaps, HttpServletRequest request, HttpServletResponse response); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|