在JAX-RS中使用@Context [第1部分]

本文介绍了JAX-RS中@Context注解的使用,包括如何注入HTTP标头、HTTP URI信息、安全上下文等资源。通过示例展示了如何利用这些注入组件来增强RESTful服务的功能。
摘要由CSDN通过智能技术生成

JAX-RS提供@Context批注,以在RESTful服务中注入各种资源。 一些最常用的注入组件是HTTP标头,HTTP URI相关信息。 这是完整列表(无特定顺序)

  • HTTP标头
  • HTTP URI详细信息
  • 安全上下文
  • 资源上下文
  • 请求
  • 组态
  • 应用
  • 提供者

让我们借助示例逐一查看

HTTP标头

尽管可以使用@HeaderParam批注来注入HTTP标头,但是JAX-RS还提供了注入HttpHeaders接口实例(作为实例变量或方法参数)的便利 。 当您要遍历所有可能的标头而不是按名称注入特定的标头值时,这很有用:

@Path("testinject")
public class InjectURIDetails{
    //localhost:8080/<root-context>/testinject/httpheaders
    @GET
    @Path("httpheaders")
    public void test(@Context HttpHeaders headers){
        System.out.println("ALL headers -- "+ headers.getRequestHeaders().toString());
        System.out.println("'Accept' header -- "+ headers.getHeaderString("Accept"));
        System.out.println("'TestCookie' value -- "+ headers.getCookies().get("TestCookie").getValue());
    }
}

HTTP URI详细信息

UriInfo是另一个接口,其实例可以由JAX-RS注入(作为实例变量或方法参数)。 使用此实例来获取与请求URI及其参数(查询,路径)有关的其他详细信息:

@Path("testinject")
public class InjectURIDetails{
  //localhost:8080/<root-context>/testinject/uriinfo
  @GET
  @Path("uriinfo")
  public void test(@Context UriInfo uriDetails){
      System.out.println("ALL query parameters -- "+ uriDetails.getQueryParameters().toString());
      System.out.println("'id' query parameter -- "+ uriDetails.getQueryParameters.get("id"));
      System.out.println("Complete URI -- "+ uriDetails.getRequestUri());
  }
}

提供者

Providers接口的实例可以使用@Context注入。 需要意识到以下事实:这仅在现有提供者中有效。 Providers实例使当前Provider能够在当前JAX-RS容器中搜索其他注册的提供商。

注意 :请不要在提供者与提供者之间感到困惑。

提供者
  • JAX-RS Provider是任何类的通用术语,它通过实现JAX-RS规范公开的标准接口来补充/扩展JAX-RS功能。
  • 使用@Provider批注对其进行批注,以在运行时自动发现
  • JAX-RS提供程序的示例是–消息正文读取器,消息正文编写器,异常映射器和上下文提供程序。
提供者

引用在本小节中讨论的(可注入)javax.ws.rs.ext.Providers接口

安全上下文

如果您想获得更多关于调用RESTful服务的实体身份的信息,请注入javax.ws.rs.core.SecurityContext接口的实例(作为实例变量或方法参数)。 此接口公开以下信息

  • 代表调用方的java.security.Principal实例
  • 用户是否是特定角色的一部分
  • 使用哪种身份验证方案(BASIC / FORM / DIGEST / CERT)
  • 是否通过HTTPS调用请求
    @Path("testinject")
    public class InjectSecurityContext{
      //localhost:8080/<root-context>/testinject/securitycontext
      @GET
      @Path("securitycontext")
      public void test(@Context SecurityContext secContext){
          System.out.println("Caller -- "+ secContext.getUserPrincipal()getName());
          System.out.println("Authentication Scheme -- "+ secContext.getAuthenticationScheme());
          System.out.println("Over HTTPS ? -- "+ secContext.isSecure());
          System.out.println("Belongs to 'admin' role? -- "+ secContext.isUserInRole("admin");
      }
    }

仅此部分而已。 其余的注射剂将在下一次迭代中介绍。

直到那时..干杯!

翻译自: https://www.javacodegeeks.com/2015/05/using-context-in-jax-rs-part-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值