Java 无法使用Glassfish4和JAX-RS绑定ContainerRequestFilter

Java 无法使用Glassfish4和JAX-RS绑定ContainerRequestFilter,java,rest,glassfish,jax-rs,Java,Rest,Glassfish,Jax Rs,将ContainerRequestFilter附加到Glassfish4中非常简单的JAX-RSREST应用程序时遇到问题 我相信我已经遵循了javadoc和其他各种教程来源的说明,但现在我完全不知所措 整个源代码(非常简短)如下所示,具有预期的功能: (登录)用户可以登录,响应为“You is loggin,uname” (验证)用户访问,且响应为401未经授权 第二位意味着可以实现为过滤器。实际情况是第一位(登录)起作用,第二位(验证)完全忽略过滤器(日志中不包含任何指示过滤器运行的内容

将ContainerRequestFilter附加到Glassfish4中非常简单的JAX-RSREST应用程序时遇到问题

我相信我已经遵循了javadoc和其他各种教程来源的说明,但现在我完全不知所措

整个源代码(非常简短)如下所示,具有预期的功能:

  • (登录)用户可以登录,响应为“You is loggin,uname”
  • (验证)用户访问,且响应为401未经授权
第二位意味着可以实现为过滤器。实际情况是第一位(登录)起作用,第二位(验证)完全忽略过滤器(日志中不包含任何指示过滤器运行的内容)。也就是说,输出只是“一切都很好,uname”,而不是401错误

我想了解的是将过滤器连接到验证操作的方法。供参考

  • 我在运行glassfish 4.1 build 13
  • 我正在使用gradle编译和部署,并执行部署操作
    • 刺客部署--强制--contextroot/app/path/to/app.war
  • Glassfish报告说它正在使用Jersey 2.10.4
以下是与应用程序相关的全部源代码:

RestApp.java

package test.pack;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class RestApp extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Login.class);
        return classes;
    }
}
@ApplicationPath("/api")
public class RestApp extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Login.class);
        return classes;
    }

    @Override
    public Set<Object> getSingletons()
    {
        Set<Object> singletons = new HashSet<Object>();
        singletons.add(new LoggedInFilter());
        return singletons;
    }
}
Secured.java

package test.pack;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.ws.rs.NameBinding;

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Secured 
{
}
LoggedInFilter.java

package test.pack;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Response;

@Secured
public class LoggedInFilter implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException 
    {
        System.out.println("request");
        requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
    }
}

啊。那太尴尬了

我访问的下一个教程有一个解决方案,就是在RestApp类中注册过滤器

RestApp.java

package test.pack;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class RestApp extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Login.class);
        return classes;
    }
}
@ApplicationPath("/api")
public class RestApp extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Login.class);
        return classes;
    }

    @Override
    public Set<Object> getSingletons()
    {
        Set<Object> singletons = new HashSet<Object>();
        singletons.add(new LoggedInFilter());
        return singletons;
    }
}
@ApplicationPath(“/api”)
公共类RestApp扩展了应用程序
{
@凌驾

publicset>classes=newhashsetUgh.这太尴尬了

我访问的下一个教程有一个解决方案,就是在RestApp类中注册过滤器

RestApp.java

package test.pack;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class RestApp extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Login.class);
        return classes;
    }
}
@ApplicationPath("/api")
public class RestApp extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Login.class);
        return classes;
    }

    @Override
    public Set<Object> getSingletons()
    {
        Set<Object> singletons = new HashSet<Object>();
        singletons.add(new LoggedInFilter());
        return singletons;
    }
}
@ApplicationPath(“/api”)
公共类RestApp扩展了应用程序
{
@凌驾
公共集>类=新哈希集