【问题标题】:Intercepting based on HTTP header in RESTeasyRESTeasy中基于HTTP头的拦截
【发布时间】:2023-04-04 15:08:01
【问题描述】:

我正在开发两种类型的 REST 服务。

  • 在登录之前,不会将会话令牌传递给 HTTP 标头。
  • 登录后会话令牌将在每个请求中传递。

我不想在每个 REST 方法中都包含 @HeaderParam。我想先拦截它,并基于此我想检查会话的有效性。请告诉我

  1. 如何根据 RESTEasy 中的标头进行拦截
  2. 如何避免拦截少数方法

谢谢。

【问题讨论】:

    标签: java rest jax-rs resteasy


    【解决方案1】:

    我使用 PreProcessInterceptor 解决了这个问题

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Securable {
      String header() default "session-token";
    }
    
    @Provider
    @ServerInterceptor
    public class ValidationInterceptor implements PreProcessInterceptor, AcceptedByMethod {
    
      @Context
      private HttpServletRequest servletRequest;
    
      @Override
      public boolean accept(Class clazz, Method method) {
        return method.isAnnotationPresent(Securable.class);
      }
    
      @Override
      public ServerResponse preProcess(HttpRequest httpRequest, ResourceMethod resourceMethod) throws Failure,
          WebApplicationException {
    
        Securable securable =  resourceMethod.getMethod().getAnnotation(Securable.class);
        String headerValue = servletRequest.getHeader(securable.header());
    
        if (headerValue == null){
          return (ServerResponse)Response.status(Status.BAD_REQUEST).entity("Invalid Session").build();
        }else{
          // Validatation logic goes here
        }
    
        return null;
      }
    }
    

    注解@Securable将用于需要验证的REST服务。

    @Securable
    @PUT
    public Response updateUser(User user)
    

    【讨论】:

    • 如果您使用的是 Jersey,则创建一个注释“x”并在注释中提及 @NameBinding。创建 ContainerRequestFilter 并将注释“x”添加到此过滤器。现在用“x”注释装饰你的服务
    【解决方案2】:

    有两种方法

    1. 使用JAX-RS interceptors - 您可以访问拦截器中的请求对象,因此您可以读取标头

    2. 使用良好的旧 JavaServlet 过滤器 - 使用 JAX-RS 不是问题,您也可以过滤 REST 请求。与拦截器类似,过滤器可以访问请求对象,该对象具有标头信息

    在这两种情况下,您都可以检查 HttpSession 是否存在(request.getSession() 方法)并且它具有必需的属性。

    您可以在配置中或在 Java 代码中以编程方式包含/排除过滤的请求,查看请求路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 2019-12-03
      • 2017-11-16
      • 2018-04-14
      • 2018-01-31
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多