我使用spring-ws 4.3.3并且我想知道是否可以获得包含datahandler参数的soap请求的真实内容大小。
如果请求大小似乎小于4096字节,则以下代码可以正常工作;否则,如果content-size大于4096,则requestSize等于-1。但是在javadoc中写道:
返回请求正文的长度(以字节为单位),并使其可用 *输入流,如果长度未知,则为-1,大于 * Integer.MAX_VALUE
在我的示例中,如果soap请求超过51200000,我会尝试生成错误消息,但如果我的请求大于4096,则会出现错误。
TransportContext tc = TransportContextHolder.getTransportContext();
HttpServletConnection connection = (HttpServletConnection) tc.getConnection();
Integer requestSize = connection.getHttpServletRequest().getContentLength();
if (requestSize==-1 || requestSize > 51200000) {
response.setStatus(getStatusResponse(PricingConstants.WS_FILE_SIZE_EXCEEDED_CODE,
PricingConstants.WS_FILE_SIZE_EXCEEDED_MSG));
return response;
XSD
<xs:complexType name="wsAddDocumentRequest">
<xs:sequence>
<xs:element name="callingAspect">
<xs:complexType>
<xs:sequence>
<xs:element name="userId" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Id" type="xs:string" />
<xs:element name="contentPath" type="xs:string" minOccurs="0" />
<xs:element name="file" type="xs:base64Binary" minOccurs="0"
xmime:expectedContentTypes="application/octet-stream" />
<xs:element name="document" type="prc:document" />
<xs:element name="authorizedUsers" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="user" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
由于
答案 0 :(得分:0)
该大小的请求通常使用HTTP分块,并且事先不知道内容长度,即getContentLength()
将返回-1。要禁止超过一定大小的请求,您可以配置应用程序服务器(如果它有一个限制请求大小的选项),也可以安装一个servlet过滤器,在从请求中读取一定数量的字节后触发错误。 / p>
答案 1 :(得分:0)
感谢Andreas打开我的想法
我找到了解决方案
/**
* Returns true if content size exceeds the max file size
*
* @param dataHandler content
* @param maxSize the max size allowed
* @return true if contentSize greater than maxSize, false otherwise
* @throws IOException
*/
public static boolean isTooBigContent(DataHandler dataHandler, long maxSize) throws IOException {
long contentSize = 0;
try (InputStream input = dataHandler.getInputStream()) {
int n;
while (IOUtils.EOF != (n = input.read(new byte[4096]))) {
contentSize += n;
if (Long.compare(contentSize, maxSize) > 0)
return true;
}
}
return false;
}