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

时间:2018-09-04 17:58:06

标签: java servlets servlet-3.0 java-6

我正在寻找为传入的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
        }

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现这种功能。一次,我对WebSphere不太熟悉,所以如果我错了,请纠正我。

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

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

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

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

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

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

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

无论如何,除了做上述事情之外,真正的事情就是在大小超出所需限制的情况下进行操作。在您的代码示例中,您似乎试图读取它,直到获得所需的大小,然后才返回到目前为止所读的内容。我的想法是这是错误的,因为您最终可能会获得无效的请求正文。我认为最好是在超出允许的限制的情况下实际删除请求。

我希望以上帮助。