javaioIOException Stream closed ServletRequestshiro AccessControlFilter 拦截MultipartHttpServletRequest中body内容后字符流关闭。怎么解决
您可以尝试以下方法来解决该问题:
-
确保您在过滤器链中的 Shiro 过滤器之前配置了 MultipartFilter。这是由于在 Shiro 过滤器之前使用 MultipartFilter 会确保 MultipartHttpServletRequest 的流保持打开状态,以便后续的过滤器可以继续使用。
-
如果您不能更改过滤器链的配置,您可以尝试在 Shiro 过滤器之前创建一个自定义过滤器,并在其中将 MultipartHttpServletRequest 的流重新包装为一个可重复读取的流。以下是一个示例代码:
public class MultipartWrapperFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest && !(request instanceof MultipartHttpServletRequest)) {
// 如果是 HttpServletRequest,并且不是 MultipartHttpServletRequest,则将请求重新包装为 MultipartHttpServletRequest
HttpServletRequest httpRequest = (HttpServletRequest) request;
ServletRequest wrappedRequest = new MultipartHttpServletRequestWrapper(httpRequest);
chain.doFilter(wrappedRequest, response);
} else {
chain.doFilter(request, response);
}
}
// 其他 Filter 接口方法的实现...
}
在上述代码中,MultipartHttpServletRequestWrapper 是一个自定义的包装器类,它将原始的 HttpServletRequest 包装为 MultipartHttpServletRequest,并确保流可以重复读取。您可以根据自己的需求来实现该类。
- 如果以上方法都无法解决问题,您可以考虑在 Shiro 过滤器之前将 MultipartHttpServletRequest 的内容读取到一个字节数组中,并将该字节数组封装到自定义的 HttpServletRequestWrapper 中。然后,将该包装器传递给 Shiro 过滤器。这样可以确保 Shiro 过滤器能够读取请求的内容,而不会受到流关闭的影响。以下是一个示例代码:
public class MultipartContentWrapper extends HttpServletRequestWrapper {
private final byte[] content;
public MultipartContentWrapper(HttpServletRequest request) throws IOException {
super(request);
content = IOUtils.toByteArray(request.getInputStream());
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new ServletInputStreamWrapper(content);
}
// 其他 HttpServletRequestWrapper 方法的实现...
}
在上述代码中,ServletInputStreamWrapper 是一个自定义的包装器类,它将字节数组包装为 ServletInputStream。您可以根据自己的需求来实现该类。
注意:以上解决方案仅供参考,具体的实现方式可能会根据您的应用程序和框架的要求而有所不同。请根据实际情况进行调整和修改
原文地址: http://www.cveoy.top/t/topic/iZj7 著作权归作者所有。请勿转载和采集!