如何设置传入 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。我认为如果超过允许的限制,您最好实际放弃请求。
希望以上对你有所帮助
我正在寻找设置传入 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。我认为如果超过允许的限制,您最好实际放弃请求。
希望以上对你有所帮助