java - 无法使用 Glassfish4 和 JAX-RS 绑定(bind) ContainerRequestFilter

标签 java rest glassfish jax-rs

我在将 ContainerRequstFilter 连接到 Glassfish4 内非常简单的 JAX-RS Rest 应用程序时遇到问题。

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

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

第二位意味着作为过滤器实现。实际发生的情况是,第一位(登录)起作用,第二位(验证)完全忽略过滤器(日志中不包括任何表明过滤器运行的内容)。也就是说,输出只是“一切都很好,uname”,而不是 401 错误。

我想了解的是如何将过滤器附加到验证操作。仅供引用

  • 我正在运行 glassfish 4.1 build 13
  • 我正在使用 gradle 进行编译和部署,并执行部署操作
    • assassin 部署 --force --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;
    }
}

登录.java

package test.pack;

import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

@Stateless
@Path("login/")
@Produces("text/json")
public class Login
{
    @GET
    @Path("{username}/{password}")
    public Response login(@PathParam("username") String username, @PathParam("password") String password)
    {
        System.out.println("Logging in");
        return Response.ok("You are logged in, " + username).build();
    }

    @GET
    @Path("/verify/{username}")
    @Secured
    public Response verify(@PathParam("username") String username)
    {
        System.out.println("Verify");
        return Response.ok("Everything is fine, " + username).build();
    }

安全.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

@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;
    }
}

我将把答案留在这里,而不是删除问题,因为它只出现在我读过的 4 个教程之一中,所以这可能至少有点有趣。

关于java - 无法使用 Glassfish4 和 JAX-RS 绑定(bind) ContainerRequestFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072031/

相关文章:

java - 为什么 Java 找不到 CLASSPATH 中的类?

java - 从 Java 函数返回环境变量,并在 Jenkins 中设置相同的环境变量以运行构建

glassfish - EJB 计时器服务不可用,上下文取消部署失败

java - 我按照这个 maven-glassfish-plugin 示例但是出现错误消息,为什么?

java - IllegalMonitorStateException - CyclicBarrier

java - 如果包含其他数据则显示列表 AlertDialog

java - 使用交替列表避免越界

json - TJson.JsonToObject<T> 在多线程环境中抛出错误

api - 保护 MY REST API 仅用于 MY IOS APP

java - GF4 javax.servlet.http.HttpServlet 的 OSGI bundle - ClassNotFound