This is possible by overriding the HttpServletRequest in the servlet filter.
You need to implement an HttpServletRequestWrapper that stores the request body: SRC / Java / Grails / Util / HTTP / MultiReadHttpServletRequest.java
package grails.util.http; import org.apache.commons.io.IOUtils; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletRequest; import javax.servlet.ServletInputStream; import java.io.*; import java.util.concurrent.atomic.AtomicBoolean; public class MultiReadHttpServletRequest extends HttpServletRequestWrapper { private byte[] body; public MultiReadHttpServletRequest(HttpServletRequest httpServletRequest) { super(httpServletRequest);
Servlet filter that overrides the current servletRequest: src / java / grails / util / http / MultiReadServletFilter.java
package grails.util.http; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Set; import java.util.TreeSet; public class MultiReadServletFilter implements Filter { private static final Set<String> MULTI_READ_HTTP_METHODS = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER) {{
Then you need to run grails install-templates and edit web.xml in src / templates / war and add this after the definition of charEncodingFilter:
<filter> <filter-name>multireadFilter</filter-name> <filter-class>grails.util.http.MultiReadServletFilter</filter-class> </filter> <filter-mapping> <filter-name>multireadFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
You can then call request.inputStream as often as you need.
I have not tested this specific code / procedure, but in the past I have done similar things, so it should work; -)
Note. Remember that huge requests can kill your application (OutOfMemory ...)
Siegfried Puchbauer Jun 26 '09 at 9:06 2009-06-26 09:06
source share