我尝试做的是使用这样的代码实现servlet过滤器:
int up = request.getContentLength();
if ( ( (HttpServletRequest) request ).getQueryString() != null )
{
up = Math.max( up, ( (HttpServletRequest) request ).getQueryString().length() ) ;
}
int down = ( (HttpServletResponse) response ).getBufferSize();
processIO( up, down );
但是,虽然up vaue基本上没问题,但每次请求的下限值都是8192。
任何提示赞赏, RO
答案 0 :(得分:2)
在处理请求之前和之后发生过滤:Is doFilter() executed before or after the Servlet's work is done?。
您必须在int down = ...
之前添加类似的内容:
filterChain.doFilter(request, response);
这将调用产生回复的servlet(和其他过滤器)。只有这样你才能检查回复,看看它的大小。
此外,您总是得到8192,因为您要求的是缓冲区大小,而不是回复的大小。
以下是记录所有请求和响应的示例DumpFilter。您可以将其修剪为仅记录请求和响应长度。
答案 1 :(得分:1)
getBufferSize()
返回使用的实际缓冲区大小 为了回应。如果没有缓冲 使用时,此方法返回0.
当然,缓冲区永远不会改变!你想要的是获得响应然后做大小。不幸的是,你不能只用HttpServletResponse做到这一点。但是您可以实现自己的ServletResponse和getContentLength。确保在doFilter调用后执行此操作。
修改强>
好的,我现在找不到一个好的例子,但这里有一个摘要你能做什么。使用wrapper实现您自己的响应,然后对于getOutputStream,您可以返回您的实现。在过滤器的末尾,只需获取流的大小。
答案 2 :(得分:0)
getBufferSize
返回缓冲区大小,读取the API doc。我想,您可以计算代码中的下行流量。只需在写入servlet输出流时递增计数器。
答案 3 :(得分:0)
您可以包装请求和响应,并相应地返回包装的输入和输出流。在这些包装的流中,您可以跟踪已读取和写入的字节数。
这样,它不仅适用于内存缓冲区,还适用于大量输入和输出流请求。