【问题标题】:Jersey get Request object programmaticallyJersey 以编程方式获取 Request 对象
【发布时间】:2017-07-20 19:32:09
【问题描述】:

有没有办法以编程方式获取请求(HttpServletRequest?)?我只能通过端点方法/类上的注释找到如何做到这一点。

根据https://stackoverflow.com/a/5118844/190164,我可以向我的端点添加一个带注释的参数:

@POST 
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String showTime(
    @Context HttpServletRequest httpRequest
) {
    // The method body
}

或者我可以在课堂上注入(https://stackoverflow.com/a/26181971/190164)

public class MyResource {

  @Context
  private HttpServletRequest httpRequest;

  @GET  
  public Response foo() {  
    httpRequest.getContentType(); //or whatever else you want to do with it
  }
}

但是,我想访问与泽西岛没有直接关联的另一个类中的请求。在上面的第二个示例中添加 @Context 注入不起作用,因为该类不是由 Jersey 实例化的。我希望能够做类似的事情

HttpServletRequest.getCurrentRequest()

但我无法在某处找到任何静态方法。

【问题讨论】:

  • 你能用代码或尝试编写代码来澄清更多吗?
  • @MrMisery 添加了一些示例
  • 请准确显示您想要访问它的位置,以及它是如何连接到您的泽西岛资源的
  • @peeskillet 我希望能够从资源处理期间调用的任何函数访问它,而无需更改我的所有端点。访问它的地方可能与资源没有“连接”,除了资源函数位于调用堆栈的某处
  • 最好的办法是使用依赖注入。 HttpServletRequest 可以注入到系统中绑定的任何服务中。除此之外,使用 DI 是一种很好的做法。见stackoverflow.com/documentation/jersey/7016/…

标签: jersey jersey-2.0


【解决方案1】:

如果您正在寻找一些安全解决方案,您可以使用 servlet 过滤器(创建实现 Filter 的类)或者您可以实现 ContainerRequestFilter 并通过覆盖 filter 您可以执行过滤。外部过滤器上下文元素是始终只能在控制器中访问(放置路径注释的位置),除了将其传递给所需的方法或对象之外,无法从控制器外部访问此类内容:

  @Context
private HttpServletRequest httpRequest;

  @GET  
  public Response foo() {  
    someMethod(httpRequest); //or whatever else you want to do with it
  }
}

希望这会有所帮助。

【讨论】:

  • 我没有做任何安全工作。我想要这个做一些事情,但我想最简单的一个是我想在我的日志中包含请求 url
  • 正如我所提到的,您可以将其作为参数传递给您的方法。这种方式也很简单,因为我没有完全理解你在做什么。
  • 我特别不想将它传递给我的资源。如果我这样做,我需要通过至少 50 个函数
  • 你可以把它传给包含那些函数的类,没有别的办法
  • 但是我可以在不同的线程上有多个请求,所以任何“全局”(在类中)都不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2014-01-04
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多