1

为了验证 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 客户端和正文中的 JSON 进行测试。

4

2 回答 2

0

我唯一能想到的是,不知何故,在您的过滤器获取ContainerRequest. 是否还有其他类仍在读取数据,或者您的Jersey设置是否以某种方式错误配置,以便资源类在您的过滤器之前读取输入流?

于 2014-05-26T16:51:39.783 回答
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;
}
于 2013-07-19T08:08:25.270 回答