diff --git a/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy b/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy index ce0c0f30a2e..79b137a3850 100644 --- a/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy +++ b/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy @@ -17,6 +17,7 @@ package grails.artefact.controller.support import grails.web.UrlConverter import grails.web.api.WebAttributes +import grails.web.servlet.mvc.GrailsParameterMap import groovy.transform.CompileStatic import org.grails.plugins.web.controllers.metaclass.ForwardMethod import org.grails.web.mapping.ForwardUrlMappingInfo @@ -86,8 +87,12 @@ trait RequestForwarder implements WebAttributes { def request = webRequest.currentRequest def response = webRequest.currentResponse request.setAttribute(ForwardMethod.IN_PROGRESS, true) - String uri = UrlMappingUtils.forwardRequestForUrlMappingInfo(request, response, urlInfo, (Map)model, true) + + if(params.params instanceof Map) { + urlInfo.parameters.putAll((Map)params.params) + } request.setAttribute(ForwardMethod.CALLED, true) + String uri = UrlMappingUtils.forwardRequestForUrlMappingInfo(request, response, urlInfo, (Map)model, true) return uri } diff --git a/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java b/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java index 23e39ee5497..b2bf6682570 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java +++ b/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java @@ -475,4 +475,24 @@ public static String getForwardURI(HttpServletRequest request) { return result; } + /** + * Check whether the given request is a forward request + * + * @param request The request + * @return True if it is a forward request + */ + public static boolean isForward(HttpServletRequest request) { + return request.getAttribute(FORWARD_REQUEST_URI_ATTRIBUTE) != null; + } + + /** + * Check whether the given request is an include request + * + * @param request The request + * @return True if it is an include request + */ + public static boolean isInclude(HttpServletRequest request) { + return request.getAttribute(INCLUDE_REQUEST_URI_ATTRIBUTE) != null; + } + } diff --git a/grails-web-mvc/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequestFilter.java b/grails-web-mvc/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequestFilter.java index 0aef999a93d..68e73e28f33 100644 --- a/grails-web-mvc/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequestFilter.java +++ b/grails-web-mvc/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequestFilter.java @@ -50,6 +50,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse throws ServletException, IOException { LocaleContextHolder.setLocale(request.getLocale()); + boolean isIncludeOrForward = WebUtils.isForward(request) || WebUtils.isInclude(request); + GrailsWebRequest previous = isIncludeOrForward ? GrailsWebRequest.lookup(request) : null; GrailsWebRequest webRequest = new GrailsWebRequest(request, response, getServletContext()); configureParameterCreationListeners(webRequest); @@ -72,8 +74,17 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse } finally { webRequest.requestCompleted(); - WebUtils.clearGrailsWebRequest(); - LocaleContextHolder.setLocale(null); + + if(isIncludeOrForward) { + if(previous != null) { + WebUtils.storeGrailsWebRequest(previous); + } + } + else { + + WebUtils.clearGrailsWebRequest(); + LocaleContextHolder.setLocale(null); + } if (logger.isDebugEnabled()) { logger.debug("Cleared Grails thread-bound request context: " + request); } diff --git a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java index 6472a515fdc..ec2234ebd59 100644 --- a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java +++ b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java @@ -33,6 +33,7 @@ import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.request.WebRequest; import org.springframework.web.context.support.WebApplicationContextUtils; +import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; @@ -177,6 +178,7 @@ public static String forwardRequestForUrlMappingInfo(HttpServletRequest request, info.configure(webRequest); webRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST); webRequest.removeAttribute(UrlMappingsHandlerMapping.MATCHED_REQUEST, WebRequest.SCOPE_REQUEST); + webRequest.removeAttribute("grailsWebRequestFilter" + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, WebRequest.SCOPE_REQUEST); dispatcher.forward(request, response); return forwardUrl; }