Skip to content

Commit a0ed7ef

Browse files
authored
Merge pull request #10632 from grails/3.2.x-grails-issue-10583
Pass parameters in forward
2 parents 62bc6c1 + 98307a5 commit a0ed7ef

File tree

4 files changed

+44
-27
lines changed

4 files changed

+44
-27
lines changed

grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import grails.web.UrlConverter
1919
import grails.web.api.WebAttributes
2020
import grails.web.mapping.LinkGenerator
2121
import groovy.transform.CompileStatic
22+
import org.grails.web.mapping.UrlMappingUtils
2223
import org.grails.web.mapping.mvc.UrlMappingsHandlerMapping
2324
import org.grails.web.servlet.mvc.GrailsWebRequest
2425
import org.grails.web.util.GrailsApplicationAttributes
@@ -89,6 +90,13 @@ trait RequestForwarder implements WebAttributes {
8990
if(params.plugin) {
9091
params.plugin = params.plugin
9192
}
93+
94+
if ( !params.params ) {
95+
params.params = UrlMappingUtils.findAllParamsNotInKeys(
96+
UrlMappingUtils.findAllParamsNotInUrlMappingKeywords(webRequest.params),
97+
webRequest.originalParams.keySet()
98+
)
99+
}
92100
}
93101

94102
Map model = params.model instanceof Map ? (Map)params.model : Collections.EMPTY_MAP

grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,13 +247,20 @@ public GrailsParameterMap getParams() {
247247
}
248248

249249
/**
250-
* Reset params by re-reading & initializing parameters from request
250+
* @return The Grails params object
251251
*/
252-
public void resetParams() {
252+
public GrailsParameterMap getOriginalParams() {
253253
if (originalParams == null) {
254254
originalParams = new GrailsParameterMap(getCurrentRequest());
255255
}
256-
params = (GrailsParameterMap)originalParams.clone();
256+
return originalParams;
257+
}
258+
259+
/**
260+
* Reset params by re-reading & initializing parameters from request
261+
*/
262+
public void resetParams() {
263+
params = (GrailsParameterMap)getOriginalParams().clone();
257264
}
258265

259266
@SuppressWarnings("rawtypes")

grails-web-url-mappings/src/main/groovy/grails/web/mapping/UrlMapping.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717

1818
import grails.validation.ConstrainedProperty;
1919

20-
import java.util.Arrays;
21-
import java.util.List;
22-
import java.util.Map;
20+
import java.util.*;
2321

2422
/**
2523
* <p>Defines a URL mapping. A URL mapping is a mapping between a URI such as /book/list and
@@ -104,19 +102,21 @@ public interface UrlMapping extends Comparable, UrlCreator {
104102

105103
String EXCEPTION = "exception";
106104

107-
List<String> KEYWORDS = Arrays.asList(CONTROLLER,
108-
ACTION,
109-
HTTP_METHOD,
110-
REDIRECT_INFO,
111-
VERSION,
112-
URI,
113-
PLUGIN,
114-
NAMESPACE,
115-
VIEW,
116-
RESOURCES,
117-
INCLUDES,
118-
PERMANENT,
119-
EXCEPTION);
105+
Set<String> KEYWORDS = new HashSet<String>() {{
106+
add(CONTROLLER);
107+
add(ACTION);
108+
add(HTTP_METHOD);
109+
add(REDIRECT_INFO);
110+
add(VERSION);
111+
add(URI);
112+
add(PLUGIN);
113+
add(NAMESPACE);
114+
add(VIEW);
115+
add(RESOURCES);
116+
add(INCLUDES);
117+
add(PERMANENT);
118+
add(EXCEPTION);
119+
}};
120120

121121
/**
122122
* Matches the given URI and returns an instance of the UrlMappingInfo interface or null

grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@
4646
import javax.servlet.http.HttpServletResponse;
4747
import java.io.IOException;
4848
import java.io.UnsupportedEncodingException;
49-
import java.util.Collections;
50-
import java.util.HashMap;
51-
import java.util.Map;
49+
import java.util.*;
5250

5351
/**
5452
* Utility methods for working with UrlMappings
@@ -64,11 +62,15 @@ private UrlMappingUtils() {
6462
*
6563
* @return a Map without entries whose key belongs to UrlMapping#KEYWORDS
6664
*/
67-
public static Map<String, Object> findAllParamsNotInUrlMappingKeywords(Map<String, Object> params) {
68-
Map<String, Object> urlParams = new HashMap<>();
69-
if ( params != null ) {
70-
for (String key : params.keySet()) {
71-
if (!UrlMapping.KEYWORDS.contains(key)) {
65+
public static Map findAllParamsNotInUrlMappingKeywords(Map params) {
66+
return findAllParamsNotInKeys(params, UrlMapping.KEYWORDS);
67+
}
68+
69+
public static Map findAllParamsNotInKeys(Map params, Set keys) {
70+
Map urlParams = new HashMap<>();
71+
if ( params != null && keys != null ) {
72+
for (Object key : params.keySet()) {
73+
if (!keys.contains(key)) {
7274
urlParams.put(key, params.get(key));
7375
}
7476
}

0 commit comments

Comments
 (0)