如何设置传入 HTTPServletRequest 对象的限制?

How to set the limit on incoming HTTPServletRequest object?

我正在寻找设置传入 HTTP 请求最大限制的选项,例如想要将限制设置为不超过 6MB?我怎样才能做到这一点?

我的代码片段;

public String getContent(HttpServletRequest request)
                    throws IOException {

                StringBuffer lines = new StringBuffer();
                try {
//Tried the below line not sure if it is right but did not work    
//BufferedReader reader = new BufferedReader(request.getReader(),60048);

                   if(req.getContentLength()< 600048) {
                    BufferedReader reader = request.getReader();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        lines.append(line);
                    }
                    reader.close();
                } catch (IOException exc) {

                    throw exc;
                }
                return lines.toString();
            }

           }//Check for size ends here
        }

您可以通过多种方式实现此类功能。这一次,我对 WebSphere 不是很熟悉,所以如果我错了请纠正我。

  • 选项 1 - 在服务器级别处理此问题

WebSphere 似乎提供了一种与 Tomcat 的 maxPostSize 非常相似的配置 属性。对于 Tomcat 的情况,这限制了连接器级别的最大 post 大小。我想 WebSphere 的等效项是 PostSizeLimit。您可以继续编辑应用程序服务器的配置文件,将其设置为所需的大小(以字节为单位)。

  • 选项 2 - 以编程方式处理此问题

HttpServletRequest 不提供开箱即用的方法来检查传入请求的大小。为了克服这个问题,有两种选择。一种是尝试检索 Content-Length header 的值。问题是这可能并不总是存在。另一个潜在的问题是,这个 returns 只有 body 的大小(不包括 headers),因为它被定义为 here.

如果您确定此 header 将始终存在并且假设您不关心 header 的大小,您可以继续尝试此操作。

另一种方法是尝试使用 ServletRequest#getContentLength,它也可能 return body 的大小。

最后一个最终方法是获取请求的 inputStream,使用 BufferedReader 在本地读取它并将其存储在字节数组中。有了这个,您应该能够确定尺寸。关于此解决方案的唯一问题是 HttpServletRequest inputStream 只能读取一次,这意味着您需要以某种方式缓存它(基于过滤器的解决方案对此非常有用)。

总之,除了执行上述操作之外,真正的事情是您在大小超过所需限制的情况下所做的事情。在您的代码示例中,您似乎试图阅读它直到达到所需的大小,然后 return 到目前为止您已阅读的任何内容。我的想法是这是错误的,因为您最终可能会收到无效请求 body。我认为如果超过允许的限制,您最好实际放弃请求。

希望以上对你有所帮助