【问题标题】:Jersey 2 request filter are not working in this codeJersey 2 请求过滤器在此代码中不起作用
【发布时间】:2018-11-05 07:11:18
【问题描述】:

我已经使用 Jersey 2 实现了一个注释,但不知何故代码没有达到那个点。

这些是我的课程:

安全

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

import javax.ws.rs.NameBinding;

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

安全实施:

import javax.annotation.Priority;
import javax.ws.rs.Priorities;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;

@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class SecureImplementation implements ContainerRequestFilter
{
  @Override
    public void filter(ContainerRequestContext requestContext) throws 
  IOException {
        System.out.println("Inside Something");
        throw new WebApplicationException(Status.UNAUTHORIZED);
}
}

测试类

@Path("/checkClass")
public class TestingClass{

    @Secured
    @Path("/checkFilter")
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Map<String, String> testing(Input input)
            throws Exception {
        Map<String, Object> responseMap = new HashMap<String, Object>();
        responseMap.put("result","Success");
        return responseMap;
   }
  }

它给了我一个响应,而不是给我一个 401 错误。那么,我在这里做错了什么?

【问题讨论】:

  • 返回401错误的代码在哪里?您是否尝试使用过滤器发送 401 错误?
  • GetAllAvailableCandidateList 在哪里定义?课堂内extends ResourceConfig?
  • @AmidalaSivaKumar 是的,我在 throw new WebApplicationException(Status.UNAUTHORIZED);关于 SecureImplementation
  • @user7294900 抱歉,有一个错字,现在已修复

标签: java jax-rs jersey-2.0


【解决方案1】:

通常TestingClass应与过滤器一起注册在应用程序类中,例如:

@ApplicationPath("checkClass")
public class MyApplication extends ResourceConfig {

    public MyApplication () {
        register(TestingClass.class);
        register(SecureImplementation.class);
    }
}


@Path("/checkFilter")
public class TestingClass{

    @Secured
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Map<String, String> testing(Input input)

【讨论】:

  • 当我在单独的项目中使用它时,我没有使用这种类型的类,但它仍然可以工作。所以,我认为这也适用于此。所以你认为我必须添加这个类吗?
  • @MaxNewton 这是一种将过滤器连接到球衣路径的方法,还有其他方法,如stackoverflow.com/questions/12893529/…
  • 好的,我去看看其他答案
  • @MaxNewton 您似乎使用注释,因此您可以将@ApplicationPath("checkClass") 添加到MyApplication 并将@Path("/checkFilter") 移动到TestingClass 声明
  • 我试过这样做,改变了我的 web.xml 和我的新类: public class MyApplication extends ResourceConfig { public MyApplication() { packages("com.test"); } } 过滤器仍然不起作用
猜你喜欢
  • 2014-09-19
  • 2017-05-23
  • 2016-07-27
  • 2018-03-28
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
相关资源
最近更新 更多