java – 如何在注入JAX-RS Web服务的CDI bean中获取HTTP请求标头?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何在注入JAX-RS Web服务的CDI bean中获取HTTP请求标头?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3464字,纯文字阅读大概需要5分钟。
内容图文
![java – 如何在注入JAX-RS Web服务的CDI bean中获取HTTP请求标头?](/upload/InfoBanner/zyjiaocheng/827/3829496fe299403b9de0af8d0b781567.jpg)
我有这样的网络服务:
@Path("/projects")
public class Projects {
[...]
@Inject
CurrentRequest current;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{id}")
public Response getProject(@PathParam("id") String id) {
if (current.isUserAuthenticated()) {
[...do something...]
}?else {
[...produce an error...]
}
}
}
还有一个带有auth checker方法的CDI bean,如下所示:
@RequestScoped
public class CurrentRequest {
public boolean isUserAuthenticated() {
[...do some header checking...]
}
}
我的问题是,我无法在生活中获取CurrentRequest内部的HTTP标头.我尝试注入HttpServletRequest,但它没有初始化.我尝试使用@Context,同样的事情.显然,FacesContext.getCurrentInstance()不起作用,因为没有FacesContext.
我看到this question基本上都在问同样的事情,但是没有得到太多的关注.
我目前的方法是在Projects中使用@Context HttpServletRequest请求,并将其作为参数传递给current.isUserAuthenticated(request).但那感觉很糟糕. CDI bean不应该知道它自己的请求吗?
我错过了什么?
解决方法:
提取HTTP标头
您不需要JAX-RS端点中的HttpServletRequest来从请求中获取HTTP头.相反,你可以注入HttpHeaders:
@Context
HttpHeaders httpHeaders;
然后,您可以使用HttpHeaders API获取标头值:
> HttpHeaders#getHeaderString(String)
> HttpHeaders#getRequestHeaders()
> HttpHeaders#getHeaderString(String)
如果需要标准HTTP标头的值,请考虑使用constants available in the HttpHeaders API:
// Get the value of the Authorization header
String authorizationHeader = httpHeaders.getHeaderString(HttpHeaders.AUTHORIZATION);
使用过滤器
由于您正在执行身份验证和/或授权,因此我建议您使用过滤器,这样您就可以保持REST端点的精简并专注于业务逻辑.
要将过滤器绑定到REST端点,JAX-RS提供了元注释@NameBinding,可以按如下方式使用:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Secured { }
@Secured注释将用于装饰过滤器类,它实现ContainerRequestFilter,允许您处理请求.
ContainerRequestContext可帮助您从HTTP请求中提取信息(有关详细信息,请查看ContainerRequestContext API):
@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class SecurityFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// Use the ContainerRequestContext to extract information from the HTTP request
// Information such as the URI, headers and HTTP entity are available
}
}
如果用户未经过身份验证/授权,则ContainerRequestFilter#filter()方法是中止请求的好地方.为此,您可以使用ContainerRequestContext#abortWith()或抛出异常.
@Provider注释标记了在提供程序扫描阶段JAX-RS运行时应该可以发现的扩展接口的实现.
要将过滤器绑定到端点方法或类,请使用上面创建的@Secured注释对其进行注释.对于注释的方法和/或类,将执行过滤器.
@Path("/")
public class MyEndpoint {
@GET
@Path("{id}")
@Produces("application/json")
public Response myUnsecuredMethod(@PathParam("id") Long id) {
// This method is not annotated with @Secured
// The security filter won't be executed before invoking this method
...
}
@DELETE
@Secured
@Path("{id}")
@Produces("application/json")
public Response mySecuredMethod(@PathParam("id") Long id) {
// This method is annotated with @Secured
// The security filter will be executed before invoking this method
...
}
}
在上面的示例中,安全过滤器将仅针对mySecuredMethod(Long)执行,因为它使用@Secured进行了注释.
您可以根据需要为REST端点提供尽可能多的过滤器.要确保过滤器的执行顺序,请使用@Priority对其进行注释.
强烈建议使用Priorities类中定义的值之一(将使用以下顺序):
> AUTHENTICATION
> AUTHORIZATION
> ENTITY_CODER
> HEADER_DECORATOR
> USER
如果您的过滤器未使用@Priority进行注释,则将使用USER优先级执行过滤器.
附加信息
你可能会发现answer很有用.
内容总结
以上是互联网集市为您收集整理的java – 如何在注入JAX-RS Web服务的CDI bean中获取HTTP请求标头?全部内容,希望文章能够帮你解决java – 如何在注入JAX-RS Web服务的CDI bean中获取HTTP请求标头?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。