Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建ServletRequestWrapper以保留请求正文副本的含义_Java_Servlets_Servlet Filters - Fatal编程技术网

Java 创建ServletRequestWrapper以保留请求正文副本的含义

Java 创建ServletRequestWrapper以保留请求正文副本的含义,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,我有一个servlet过滤器,它读取请求参数/头并在调用chain.doFilter(req,resp)之前执行一些逻辑。响应该调用的servlet在链的下游有一个空流,因为请求流已经在过滤器中读取。 为了解决这个问题,我创建了一个ServletRequestWrapper,读取输入流并缓存最终通过重写的getInputStream方法传输的主体 doFilter(wrapper,resp)现在将承载有效负载,一切正常,并修复了我的问题 然而,我的问题是性能。创建一个包装器来缓存我的请求主体实际

我有一个servlet过滤器,它读取请求参数/头并在调用chain.doFilter(req,resp)之前执行一些逻辑。响应该调用的servlet在链的下游有一个空流,因为请求流已经在过滤器中读取。 为了解决这个问题,我创建了一个ServletRequestWrapper,读取输入流并缓存最终通过重写的getInputStream方法传输的主体

doFilter(wrapper,resp)现在将承载有效负载,一切正常,并修复了我的问题

然而,我的问题是性能。创建一个包装器来缓存我的请求主体实际上是读取一次输入流,servlet最终再次读取该流,从而导致对该流的双重读取。对于POST请求来说,这可能还可以,但是一个PUT请求携带一个非常大的文件负载,可能不适合进行这种双重读取

有什么想法或替代方法吗

下面是过滤器和servlet的代码片段

//The sample Filter code
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain){
  HttpServletRequest req = (HttpServletRequest)request;
  if(verifySomething(req.getParameter('someParam'))){
   chain.doFilter(req, resp);
  }
}

//Servlet code
protected void doPut(HttpServletRequest req, HttpServletResponse resp){
    writeFile(req.getInputStream()); //Stream is empty here
}

谢谢。

您能发布代码以便我们知道是否有其他选择吗?我已经在原始帖子中添加了片段。--servlet最终再次读取流,导致流的重复读取。-该流只能读取一次!我确实通过编写一个存储流数据的ServletRequestWrapper来修复它。因此,我的问题是,将请求流存储在包装器中是否是一种良好的做法,这意味着需要额外读取流,并且如果流承载大量数据,则可能没有效率。我认为我在这篇文章中对我的问题得到了相当好的回应(不完全相关)您能发布代码以便我们知道是否有其他选择吗?我已经在原始帖子中添加了片段。--servlet最终再次读取流,导致流的重复读取。--该流只能读取一次!我确实通过编写一个存储流数据的ServletRequestWrapper来修复它。因此,我的问题是,将请求流存储在包装器中是否是一种良好的做法,这意味着需要额外读取流,并且如果流承载大量数据,则可能没有效率。我认为我在这篇文章中对我的问题得到了相当好的回应(不完全相关)