Skip to content

Commit

Permalink
fix for GRAILS-12035 - Forwarding to a different controller or action…
Browse files Browse the repository at this point in the history
… leads to an exception
  • Loading branch information
graemerocher committed Mar 4, 2015
1 parent 8e012d1 commit dba6ccf
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit dba6ccf

Please sign in to comment.