jax-rs jax-ws
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());}
}
提供者
可以使用@Context注入Providers接口的实例。 需要意识到以下事实:这仅在现有提供者中有效。 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
jax-rs jax-ws