【问题标题】:How to access HttpServletRequest inside Spring component class如何在 Spring 组件类中访问 HttpServletRequest
【发布时间】:2018-06-15 03:28:21
【问题描述】:

我正在尝试访问组件类中的 httpServletRequest。我尝试了几种方法。

@Component
public class MyService{

 @Resource
 WebServiceContext wsCtxt;

 public void myWebMethod(){
  MessageContext msgCtxt = wsCtxt.getMessageContext();
  HttpServletRequest req = ( 
  (HttpServletRequest)msgCtxt.get(MessageContext.SERVLET_REQUEST);
  String clientIP = req.getRemoteAddr();
}

这对我不起作用。因为 WebServiceContext 始终为空。然后我在 Web 服务类中尝试了相同的代码。然后该代码正在工作。我的要求是在组件类中获取 HttpServletRequest。 (最终我想做的是从请求标头中获取客户端主机)。 这可能吗?有没有其他选择?

【问题讨论】:

  • 只是想知道您为什么要这样做?
  • 我们有不同的环境,例如测试、开发、生产。我们项目的当前实现是将默认主机作为本地主机。但我们可以从 vm 选项中覆盖主机。比如 -Dserver_url=test.xxx.com ,那么 web 服务会调用测试环境中的其他 web 服务。现在我们将从通过 nginx 发送的 header 中获取主机。

标签: spring-mvc servlets


【解决方案1】:

方法#1

您是否尝试过将请求对象作为参数传递给您的服务方法,并从您的服务传递给您的组件方法,从而将其传递给您的组件?

// in your controller... Spring provides the request object
public String myController(HttpServletRequest request, ...) {
    //...
    myService.myServiceMethod(request,...);
}

// in your service...
public void myServiceMethod(HttpServletRequest request, ...) {
    //...
    myComponent.myWebMethod(request,...);
}

// in your component
public String myWebMethod(HttpServletRequest request, ...) {

    // use the raw request object
}

方法#2

此外,DispatcherServlet 通过将请求对象包装在 ServletRequestAttributes 对象中来公开请求对象,该对象又存储在 ThreadLocal 变量中。实际存储发生在RequestContextHolder 及其静态方法中。您可以通过以下方式访问它:

public void myWebMethod(){
    //...

    RequestAttributes reqAttr = RequestContextHolder.getRequestAttributes();
    ServletRequestAttributes servlReqAttr = (ServletRequestAttributes)reqAttr;
    HttpServletRequest req = servlReqAttr.getRequest();

    //...

}

虽然有点冗长,但你可以看到发生了什么。

你也可以压缩它:

((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 2017-06-13
    • 1970-01-01
    • 2012-04-03
    • 2019-02-19
    • 2012-12-15
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多