From a0df36dddab474971db0b211a62603ce712c3b29 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 23 Jan 2017 21:25:21 +0100 Subject: [PATCH] HiddenHttpMethodFilter defensively proceeds with original request in case of error dispatch Issue: SPR-15179 --- .../web/filter/HiddenHttpMethodFilter.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/filter/HiddenHttpMethodFilter.java b/spring-web/src/main/java/org/springframework/web/filter/HiddenHttpMethodFilter.java index 5d9ea1a0d39..8e13979c014 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/HiddenHttpMethodFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/HiddenHttpMethodFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2017 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. @@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import org.springframework.web.util.WebUtils; /** * {@link javax.servlet.Filter} that converts posted method parameters into HTTP methods, @@ -44,6 +45,7 @@ import org.springframework.util.StringUtils; * before this HiddenHttpMethodFilter in your {@code web.xml} filter chain. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 */ public class HiddenHttpMethodFilter extends OncePerRequestFilter { @@ -67,15 +69,16 @@ public class HiddenHttpMethodFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - String paramValue = request.getParameter(this.methodParam); - if ("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) { - String method = paramValue.toUpperCase(Locale.ENGLISH); - HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method); - filterChain.doFilter(wrapper, response); - } - else { - filterChain.doFilter(request, response); + HttpServletRequest requestToUse = request; + + if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) { + String paramValue = request.getParameter(this.methodParam); + if (StringUtils.hasLength(paramValue)) { + requestToUse = new HttpMethodRequestWrapper(request, paramValue); + } } + + filterChain.doFilter(requestToUse, response); } @@ -89,7 +92,7 @@ public class HiddenHttpMethodFilter extends OncePerRequestFilter { public HttpMethodRequestWrapper(HttpServletRequest request, String method) { super(request); - this.method = method; + this.method = method.toUpperCase(Locale.ENGLISH); } @Override