报错情况如图所示,有多种情况可能导致这个问题,首先就是由于request中的输入流是同一个。因此你如果已经使用了inputstream,那么你就不能再使用getReader去获取流。
下面是getReader()和getInputStream()的Servlet API文档说的:
public java.io.BufferedReader getReader() ... ... Throws: java.lang.IllegalStateException - if getInputStream() method has been called on this request public ServletInputStream getInputStream() ... ... Throws: java.lang.IllegalStateException - if the getReader() method has already been called for this request
解决方法1:
先将原本的请求进行类型转换为HttpServletRequest,然后在使用ContentCachingRequestWrapper进行请求转换类型。
我使用的就是这种方式,比较简单好用。
import org.springframework.web.util.ContentCachingRequestWrapper; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request1 = (HttpServletRequest) servletRequest; ContentCachingRequestWrapper request = new ContentCachingRequestWrapper(request1); }
解决方式2: