为了验证api密钥,我使用了ContainerRequestFilter来读取JSON有效负载并解析api密钥。我有以下方法。
public ContainerRequest filter(ContainerRequest request) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = request.getEntityInputStream();
try {
int read;
final byte[] data = new byte[2048];
while ((read = in.read(data)) != -1)
out.write(data, 0, read);
byte[] requestEntity = out.toByteArray();
request.setEntityInputStream(new ByteArrayInputStream(requestEntity));
if (!validate(new String(data))) {
throw new WebApplicationException(401);
}
return request;
} catch (IOException ex) {
throw new WebApplicationException(401);
}
}
但是,数据总是空白/空。没有过滤器,有效负载到达资源类并且工作正常。关于有效载荷为何空的任何线索?我正在使用Firefox的REST客户端和Body中的JSON对此进行测试。
答案 0 :(得分:0)
我假设你想打电话
validate(new String(requestEntity))
而不是
validate(new String(data))
因为在第二种情况下,您可以获得无效的JSON(如果您的有效负载足够大)。
您也可以考虑使用MessageBodyReaders
为您阅读实体:
public ContainerRequest filter(ContainerRequest request) {
// Buffer
InputStream in = request.getEntityInputStream();
if (in.getClass() != ByteArrayInputStream.class) {
// Buffer input
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ReaderWriter.writeTo(in, baos);
} catch (IOException ex) {
throw new ContainerException(ex);
}
in = new ByteArrayInputStream(baos.toByteArray());
request.setEntityInputStream(in);
}
// Read entity as a string.
final String entity = request.getEntity(String.class);
if (!validate(entity) {
throw new WebApplicationException(401);
}
// Reset buffer
ByteArrayInputStream bais = (ByteArrayInputStream)in;
bais.reset();
return request;
}
答案 1 :(得分:0)
我唯一能想到的是,不知何故,在您的过滤器获得ContainerRequest
之前,正在读取输入流。是否还有其他类仍在数据中读取,或者您的 Jersey 设置是否以某种方式错误配置,以便资源类在您的过滤器之前读取输入流?