在交付泽西岛之前检查请求实体

时间:2013-02-23 21:10:15

标签: rest jersey

我正在使用Jersey构建RESTful服务来替换现有的旧服务。

旧版请求格式要求身份验证凭据在POST请求中传递。这使得在将请求传递给Jersey之前验证请求(使用Spring安全性)很麻烦,因为必须读取POST主体以提取身份验证凭据,然后在切换到Jersey之前重新打包。

这意味着,对于每个POST请求,必须读取,重新序列化请求流,然后由Jersey MessageBodyReader再次读取。我不喜欢这样,因为它效率低下。理想情况下,我想做的是将传入的消息转换为规范的消息格式,对其进行身份验证,然后将该规范格式传递给Jersey。看起来JAX-RS似乎不支持这种事情。

是否有人建议如何避免对请求正文进行双重阅读?任何RESTful框架允许我使用自定义的规范邮件格式而不是InputStream

谢谢!

1 个答案:

答案 0 :(得分:0)

这里有几个选择。

最简单的方法是读取邮件正文并使用它来检查筛选器中的凭据。但是,如果执行此操作,则需要设置InputStream数据,以便将其传递给可能存在的任何下游过滤器(最终是消息体读取器)。听起来这就是你的方式,我建议你坚持下去。您不需要重新序列化,因为您有原始输入字符串,并且可以沿着InputStream传递它而不转换它,如果输入格式正确,您也可以避免完整序列化

或者,您可以在检查凭据的同时将所有内容转换为某些描述的规范对象,并将其存储为可由资源访问的请求变量。麻烦的是你正在与泽西的做事方式作斗争所以我不推荐它。对于局外人来说,你的资源方法看起来有点奇怪,你的过滤器需要知道你的模型的所有内容,所以设计有点颠覆。