zoukankan      html  css  js  c++  java
  • Jersey的Filter详解

    Jersey是一款实现了JAX-RS标准的RESTful Web Services开发框架。

    Jersey的Filter主要用于操作HTTP请求或响应的Headers, Methods和URI等参数。而相比较,Jersey的Interceptor主要操作Entity的输入流和输出流,如对Entity输入流进行zip/unzip。

    1. Filter的分类

    1) 根据Filter的功能

    • 请求过滤器,操作HTTP请求的过滤器。
    • 响应过滤器,操作HTTP响应的过滤器。

    2) 根据处理的位置(客户端还是服务端)

    • 服务端过滤器,过滤操作在服务端进行处理。
    • 客户端过滤器,过滤操作在客户端进行处理。

    3) 根据处理的时机(仅适用于服务端请求过滤器)

    请求过滤器的操作,都是发生在服务端资源尚未处理之前。但根据是否改变目标的服务端资源,还可以细分如下:

    • post-matching,默认,请求的服务端资源已经明确,在到达服务端资源之前通过过滤器操作请求。过滤器不能改变请求的资源目标。
    • pre-matching,设置@PreMatching,过滤器可以操作请求的目标,转换到服务器的其他资源。

    2. Filter接口

    • ContainerRequestFilter接口,服务端请求过滤器
    public void filter(ContainerRequestContext requestContext) throws IOException {...}
    • ContainerResponseFilter接口,服务端响应过滤器
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {...}

    其中,requestContext是只读的,只有responseContext是可读写的。

    • ClientRequestFilter接口,客户端请求过滤器
    public void filter(ClientRequestContext requestContext) throws IOException {...}
    • ClientResponseFilter接口,客户端响应过滤器
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {...}

    3. Filter的生效

    在Jersey应用中,首先要将Filter实现类注册为@Provider,使JAX-RS运行时能够发现该Filter实现。

    其次,在web.xml中,为ServletContainer设置初始化参数如下,包含Filter实现类所在的包com.mycompany.myapp.filters,从而对所有请求/响应生效。

    1.  
      <servlet>
    2.  
      <servlet-name>Jersey Web Application</servlet-name>
    3.  
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    4.  
      <init-param>
    5.  
      <param-name>jersey.config.server.provider.packages</param-name>
    6.  
      <param-value>com.mycompany.myapp.resources, com.mycompany.myapp.filters</param-value>
    7.  
      </init-param>
    8.  
      </servlet>

    另外,如果仅想对某些请求/响应生效,可以通过声明特定的标注给出生效的范围,并将Filter实现类注册为该标注。后续服务端资源如果希望应用该Filter实现,则给该服务端资源类设置该标注即可。详见应用示例。

    4. Filter的优先级

    在一个Jersey应用中,如果实现了多个Filter,可以通过@javax.annotation.Priority(整数)设置优先级,确定各个Filter之间的处理顺序。

    • 对于多个请求过滤器,设置@Priority(整数),整数值小的先处理,整数值大的后处理。
    • 对于多个响应过滤器,设置@Priority(整数),整数值大的先处理,整数值小的后处理。

    不建议随意设置优先级的整数值,而是推荐使用javax.ws.rs.Priorities类中定义的常量:

    • Priorities.AUTHENTICATION = 1000
    • Priorities.AUTHORIZATION = 2000
    • Priorities.HEADER_DECORATOR = 3000
    • Priorities.ENTITY_CODER = 4000
    • Priorities.USER = 5000

    5. 应用示例

    1)适用于所有请求或响应的过滤器

    1.  
      @Provider
    2.  
      @Priority(Priorities.USER)
    3.  
      public class MyFilter implements ContainerRequestFilter, ContainerResponseFilter{
    4.  
          @Override
    5.  
          public void filter(ContainerRequestContext requestContext) throws IOException {
    6.  
              requestContext.getMethod()
    7.  
      requestContext.getHeaders()
    8.  
      requestContext.getMediaType()
    9.  
      requestContext.getEntityStream()
    10.  
      ...
    11.  
          }
    12.  
          @Override
    13.  
          public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException {
    14.  
              responseContext.getHeaders().add("header_name", "header_value");
    15.  
      responseContext.getStatus()
    16.  
              ...
    17.  
          }
    18.  
      }

    注意其中@Provider的用法。

    2)适用于特定请求或响应的过滤器

    定义应用标注@MyFilterApplyHere

    1.  
      @NameBinding
    2.  
      @Retention(RetentionPolicy.RUNTIME)
    3.  
      public @interface MyFilterApplyHere {}

    定义过滤器,这里以过滤请求为例。注意标注@MyFilterApplyHere的使用。

    1.  
      @Provider
    2.  
      @MyFilterApplyHere
    3.  
      public class MyFilter implements ContainerRequestFilter {
    4.  
          @Override
    5.  
          public void filter(ContainerRequestContext requestContext) throws IOException {
    6.  
          ...
    7.  
      }
    8.  
      }

    应用过滤器,仅当请求的服务端资源为/logs时,该过滤器才生效。

    1.  
      @Path("logs")
    2.  
      @MyFilterApplyHere
    3.  
      public class MyRestApis {...}

    参考链接:

    https://jersey.github.io/documentation/latest/filters-and-interceptors.html

     https://blog.csdn.net/taiyangdao/article/details/81979971

  • 相关阅读:
    LostRoutes项目日志——玩家飞机精灵Fighter解析
    quartz Cron表达式一分钟教程
    vue-cli入门
    SQL中merge into用法
    SQLSERVER查询那个表里有数据
    C#实现复杂XML的序列化与反序列化
    MVC和WebApi 使用get和post 传递参数。
    项目管理软件推荐
    JS跨域请求
    Android动画效果translate、scale、alpha、rotate详解
  • 原文地址:https://www.cnblogs.com/liberty777/p/13724586.html
Copyright © 2011-2022 走看看