我正在为我的 JAX-RS API 创建自定义身份验证模型。由于我使用的是 Java EE 6,它不支持拦截器,因此我必须使用常规过滤器来完成。
我想根据一组规则(如公共(public)和私有(private)方法)注释我的 JAX-RS 方法。为此,我需要通过过滤器访问我的资源方法(以便能够读取注释)。
我该怎么做? 是否有任何其他不涉及将我的环境更新到 JAX-RS 2.0 的好选择?
编辑 1:不幸的是,我正在寻找可移植性。
最佳答案
我们开始了关于 CDI 的对话,但评论中无法包含该信息...所以为了解决您的顾虑:
- CDI 拦截器是可移植的。
- 为了访问
HttpServletRequest
,您需要一个前端过滤器将其置于上下文中(例如ThreadLocal
或CDI 的@RequestScoped
以及一些生产者)。但是 DeltaSpike 为您介绍了 servlet模块。另请查看 security模块。 - 将
HttpServletRequest
注入(inject)拦截器,无需对资源本身进行额外的参数。 - 要更改返回的响应,只需从
@AroundInvoke
拦截器方法返回一些内容。您可以使用InvocationContext.proceed()
访问原始方法返回的对象。 .
总结一下(几乎是伪代码):
@MySecurityInterceptorBinding
public class MySecurityInterceptor {
@Inject HttpServletRequest request;
@AroundInvoke
public Object secure(InvocationContext ctx) {
// check security
if( request.isUserInRole("foo") ) {
Object value = ctx.proceed();
// modify the returned value
((MyCustomResponseBase) value).setSecurityPassedFlag(true);
return value;
// or change it altogether (I'm not sure if this is entirely possible, try and see :)
MyResponseValueWrapper w = new MyResponseValueWrapper(value);
w.setXxxx("yyyy");
return w;
}
else {
// handle it...
}
}
关于java - 如何从常规 servlet 过滤器访问 JAX RS 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21301896/