Skip to content

Commit 226dfbb

Browse files
committed
Don't abort processing via filter if request is include or filter. Fixes #9566
1 parent 95b434e commit 226dfbb

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ trait RequestForwarder implements WebAttributes {
9696
WebUtils.exposeRequestAttributes(request, (Map)model);
9797

9898
request.setAttribute(GrailsApplicationAttributes.FORWARD_IN_PROGRESS, true)
99-
request.setAttribute(GrailsApplicationAttributes.FORWARD_ISSUED, true)
100-
10199
params.includeContext = false
102100
def fowardURI = lookupLinkGenerator().link(params)
103101

@@ -108,6 +106,7 @@ trait RequestForwarder implements WebAttributes {
108106
webRequest.removeAttribute(UrlMappingsHandlerMapping.MATCHED_REQUEST, WebRequest.SCOPE_REQUEST);
109107
webRequest.removeAttribute("grailsWebRequestFilter" + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, WebRequest.SCOPE_REQUEST);
110108
dispatcher.forward(request, response);
109+
request.setAttribute(GrailsApplicationAttributes.FORWARD_ISSUED, true)
111110
return fowardURI
112111
}
113112

grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/CompositeInterceptor.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.grails.plugins.web.filters;
1717

1818
import org.grails.web.util.GrailsApplicationAttributes;
19+
import org.grails.web.util.WebUtils;
1920
import org.slf4j.Logger;
2021
import org.slf4j.LoggerFactory;
2122
import org.springframework.web.servlet.HandlerInterceptor;
@@ -52,7 +53,8 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
5253
return false;
5354
}
5455
// if forward is called, bail out
55-
if (request.getAttribute(GrailsApplicationAttributes.FORWARD_ISSUED) != null) {
56+
if (request.getAttribute(GrailsApplicationAttributes.FORWARD_ISSUED) != null && !WebUtils.isForwardOrInclude(request)) {
57+
request.removeAttribute(GrailsApplicationAttributes.FORWARD_ISSUED);
5658
return false;
5759
}
5860
}
@@ -65,6 +67,12 @@ public void postHandle(HttpServletRequest request, HttpServletResponse response,
6567
for (HandlerInterceptor handler : handlersReversed) {
6668
handler.postHandle(request, response, o, modelAndView);
6769
}
70+
71+
// remove the FORWARD_ISSUED attribute just in case forward was called from an action
72+
// this will ensure the subsequent action works since FORWARD_ISSUED is only used
73+
// to know whether forward was called from within a filter
74+
request.removeAttribute(GrailsApplicationAttributes.FORWARD_ISSUED);
75+
6876
}
6977

7078
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@
6868
*/
6969
public class GrailsWebRequest extends DispatcherServletWebRequest {
7070

71-
private static final String FORWARD_CALLED = GrailsApplicationAttributes.FORWARD_ISSUED;
7271
private static final String REDIRECT_CALLED = GrailsApplicationAttributes.REDIRECT_ISSUED;
7372

7473
private static final Class<? extends GrailsApplicationAttributes> grailsApplicationAttributesClass = GrailsFactoriesLoader.loadFactoryClasses(GrailsApplicationAttributes.class, GrailsWebRequest.class.getClassLoader()).get(0);

grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,4 +495,14 @@ public static boolean isInclude(HttpServletRequest request) {
495495
return request.getAttribute(INCLUDE_REQUEST_URI_ATTRIBUTE) != null;
496496
}
497497

498+
/**
499+
* Check whether the given request is an include or forward request
500+
*
501+
* @param request The request
502+
* @return True if it is an include or forward request
503+
*/
504+
public static boolean isForwardOrInclude(HttpServletRequest request) {
505+
return isForward(request) || isInclude(request);
506+
}
507+
498508
}

0 commit comments

Comments
 (0)