我正在寻找设置传入 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 的情况,这限制了连接器级别的最大柱尺寸。我认为 WebSphere 的等效项是 PostSizeLimit
。您可以继续编辑应用程序服务器的配置文件,将其设置为所需的大小(以字节为单位)。
- 选项 2 - 以编程方式处理此问题
HttpServletRequest
不提供开箱即用的方法来检查传入请求的大小。为了克服这个问题,有两种选择。一种是尝试检索 Content-Length
header 的值。问题是这可能并不总是存在。另一个潜在的问题是,这仅返回正文的大小(不包括标题),如定义的 here 所示。 .
如果您确定此 header 始终存在,并且假设您不关心 header 的大小,则可以继续尝试此操作。
另一种方法是尝试使用ServletRequest#getContentLength
,它也可能返回主体的大小。
最后一种方法是获取请求的 inputStream
,使用 BufferedReader
在本地读取它并将其存储在字节数组中。有了这个,您应该能够确定尺寸。该解决方案的唯一问题是 HttpServletRequest inputStream 只能读取一次,这意味着您需要以某种方式缓存它(基于过滤器的解决方案对此非常有用)。
无论如何,除了执行上述操作之外,真正的事情是在大小超出所需限制的情况下您要做的事情。在您的代码示例中,您似乎尝试读取它,直到达到所需的大小,然后返回到目前为止您已读取的内容。我的想法是这是错误的,因为您最终可能会得到无效的请求正文。我认为,如果请求超出了允许的限制,您最好实际上放弃该请求。
希望以上内容对您有所帮助。
关于java - 如何设置传入 HTTPServletRequest 对象的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52171708/