我有一个资源类,我希望能够在调用资源方法之前检查身份验证令牌,从而避免将令牌直接传递给Resource方法。
我已将以下内容添加到web.xml中:
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.michael.services.interceptors.AuthorisationInterceptorImpl</param-value>
</context-param>
我的拦截器实现如下:
@Provider
public class AuthorisationInterceptorImpl implements javax.ws.rs.container.ContainerRequestFilter {
@Inject
private ApiAuthenticationService apiAuthenticationService
@Override
public void filter(ContainerRequestContext requestContext) {
//Code to verify token
}
}
在我的资源类中的方法之前调用filter方法;但是,当我尝试调用它的方法时,apiAuthenticationService没有被注入并且为null 我正在使用Tapestry 5.3.7,Tapestry-Resteasy 0.3.2和Resteasy 2.3.4.Final。 可以这样做吗?
答案 0 :(得分:1)
我认为这不会起作用,基于对挂毯重新编码的快速浏览。
@Inject注释是tapestry-ioc的一部分;如果一个类没有被Tapestry实例化,则@Inject注释不受尊重。
web.xml
中定义的过滤器由servlet容器(Jetty,Tomcat等)实例化,这些容器没有Tapestry和Tapestry注释的任何特殊知识。
我认为你最好在Tapestry的HttpServletRequestHandler或RequestHandler管道中提供一个过滤器(参见他们的JavaDoc)。但是,我不确定如何获得对ContainerRequestContext的访问权。
答案 1 :(得分:1)
使用tapestry-resteasy,您无需在web.xml文件中定义提供程序。
如果您想使用Tapestry的autobuild机制,只需将您的提供商与您的资源一起移至 .rest 包。
如果不想使用自动发现/ autobuild,只需将其贡献给javax.ws.rs.core.Application
@Contribute(javax.ws.rs.core.Application.class)
public static void configureRestProviders(Configuration<Object> singletons, AuthorisationInterceptor authorisationInterceptor)
{
singletons.add(authorisationInterceptor);
}
即使您可以使用其他提供程序来获取安全性,也可以采用Howard的建议并在挂毯管道中实现自己的过滤器。
顺便说一下,你也可以尝试tapestry-security:)