我目前正在开发一个应用程序,其中Jersey JAX-RS作为后端,AngularJS作为前端;我需要一种身份验证,因此对于每个请求,我都会发送一个应该由后端验证的令牌。为此,我决定创建一个Jersey过滤器来查找该令牌,然后调用我的AuthenticateService来检查用户是否可以进行身份验证。
然后通过@RolesAllowed
注释来管理授权。
这是我的问题:我不能在泽西过滤器中注入一个EJB,因为它可以很好地利用资源。但是使用过滤器,服务始终保持 null
知道如何欺骗吗? 感谢
过滤代码:
@Provider
@Priority( Priorities.AUTHORIZATION )
public class AuthenticationFilter implements ContainerRequestFilter {
@EJB( name=AuthenticationService.LOOKUP_NAME)
private AuthenticationService authService;
@Override
public void filter( ContainerRequestContext requestContext ) throws IOException {
/**
* Get headers parameters
*/
String userIdStr = requestContext.getHeaderString( SecurityConsts.HEADER_ID_PARAMETER );
int userId = 0;
if( userIdStr != null && !userIdStr.isEmpty() ) {
userId = Integer.parseInt( userIdStr );
}
String securityToken = requestContext.getHeaderString( SecurityConsts.HEADER_TOKEN );
User user = null;
/**
* If a token is present, try to authenticate the user
*/
if( securityToken != null && !securityToken.isEmpty() ) {
// NullPointerException happens here
user = authService.authenticateWithToken( userId, securityToken );
}
/**
* Set correct security context
*/
requestContext.setSecurityContext( new ConfiguratorSecurityContext( user ) );
}
}
答案 0 :(得分:13)
这或多或少知道问题。
JAX-RS 2.0不支持将EJB注入JAX-RS组件 (提供者,资源)。
但是有一些选择可以解决这个问题。
您可以尝试切换到CDI,例如将您的服务转变为@ManagedBean
并使用@Inject
。
您可以尝试通过上下文查找来获取服务,如下所示:
InitialContext context = new InitialContext(); context.lookup("java:comp/env/ejb/YourBean");
您还可以尝试使用@Stateless
对过滤器进行注释,以便由容器管理。
另见: