【问题标题】:Resource not invoked after Jersery Request FilterJersery 请求过滤器后未调用资源
【发布时间】:2015-05-17 09:49:54
【问题描述】:

我定义了两个 SpringServlet,其中一个指向自定义过滤器

@WebServlet(urlPatterns = { "/" }, initParams = {
    @WebInitParam(name = "com.sun.jersey.config.property.packages", value = "com.x.y.resource"),
    @WebInitParam(name = "com.sun.jersey.api.json.POJOMappingFeature", value = "true") })
public class JerseyServlet extends SpringServlet
{
}

@WebServlet(name = "secure", urlPatterns = "/secure/*", initParams = {
    @WebInitParam(name = "com.sun.jersey.config.property.packages", value = "com.x.y.resource"),
    @WebInitParam(name = "com.sun.jersey.spi.container.ContainerRequestFilters", value = "com.x.y.resource.OAuthFilter"),
    @WebInitParam(name = "com.sun.jersey.api.json.POJOMappingFeature", value = "true") })
public class JerseySecureServlet extends SpringServlet
{
}

任何包含“/secure/”的 URL 都被定向到 OAuthFilter 以验证 OAuth 标头的请求。所有其他 URL 都只是正常处理。

对于发送到不包含“/secure/”的 URL 的任何请求,都会正确调用相应的 JAX-RS 资源类。但是,对于包含“/secure/”的 URL,OAuthFilter 会被正确调用,但 JAX-RS 注释的 Resource 类之后永远不会被调用。

这是一个安全资源示例

@Component
@Scope("request")
@Path("/secure/example")
public class SecureResource
{
    @GET
    ...
}

这里是 OAuthFilter

@Provider
@Component
public class OAuthFilter implements ContainerRequestFilter
{
    public static final String AUTHORIZED_USER = "authorized_user";

    @Autowired
    AccessTokenService accessTokenService;

    @Autowired
    UserService userService;

    @Context
    HttpServletRequest httpRequest;

    @Override
    public ContainerRequest filter(ContainerRequest containerRequest)
    {
        OAuthServerRequest request = new OAuthServerRequest(containerRequest);
        OAuthParameters params = new OAuthParameters();
        params.readRequest(request);

        String accessToken = params.getToken();

        if (accessToken == null)
        {
            throw new WebApplicationException(Status.UNAUTHORIZED);
        }

        String userId = accessTokenService.getUserIdForToken(accessToken);

        if (userId == null)
        {
            throw new WebApplicationException(Status.UNAUTHORIZED);
        }

        User user = userService.get(userId);

        if (user == null)
        {
            throw new WebApplicationException(Status.NOT_FOUND);
        }

        httpRequest.setAttribute(AUTHORIZED_USER, user);

        return containerRequest;
    }
}

看起来一旦选择了带有“/secure/*”映射的 JerseySecureServlet 并调用了 OAuthFilter,baseURI 就是“http:/ip:port/context/secure”并且路径只是“/example”,并且没有 Resource 对应于该路径,因此没有调用任何内容。我应该怎么做才能只将此过滤器应用于包含“/secure/”的 URL?

【问题讨论】:

    标签: spring jersey jax-rs jax-ws servlet-filters


    【解决方案1】:

    我已经解决了这个问题,但我不能 100% 确定我的解决方案是否是正确的方法。我已将过滤后的 serlvet 上的注释更改为 @WebFilter,给我

    @WebServlet(urlPatterns = { "/*" }, initParams = {
        @WebInitParam(name = "com.sun.jersey.config.property.packages", value = "com.x.y.resource"),
        @WebInitParam(name = "com.sun.jersey.api.json.POJOMappingFeature", value = "true") })
    public class JerseyServlet extends SpringServlet
    {
    }
    
    @WebFilter(urlPatterns = "/secure/*", initParams = {
        @WebInitParam(name = "com.sun.jersey.config.property.packages", value = "com.x.y.resource"),
        @WebInitParam(name = "com.sun.jersey.spi.container.ContainerRequestFilters", value = "com.x.y.resource.OAuthFilter"),
        @WebInitParam(name = "com.sun.jersey.api.json.POJOMappingFeature", value = "true") })
    public class JerseySecureFilter extends SpringServlet
    {
    }
    

    这行得通。一个更好的解决方案将被接受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多