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

问题描述 投票:0回答:1

我正在寻找设置传入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
        }
java servlets servlet-3.0 java-6
1个回答
1
投票

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

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

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

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

HttpServletRequest没有提供检查传入请求大小的开箱即用方法。为了克服这个问题,有两种选择。一种是尝试检索Content-Length标头的值。问题是这可能不会一直存在。另一个潜在的问题是,这只返回正文的大小(不包括标题),因为这是定义here

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

另一种方法是尝试使用ServletRequest#getContentLength,它也可以返回身体的大小。

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

除此之外,除了执行上述操作之外的其他任何方式,如果大小超过所需限制,您所做的就是这样做。在您的代码示例中,您似乎尝试读取它直到达到所需的大小,然后返回到目前为止您已阅读的内容。我的想法是这是错误的,因为你可能最终得到一个无效的请求体。我认为,如果超过允许的限制,实际删除请求会更好。

我希望以上的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.