Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 如何在Spring组件类中访问HttpServletRequest_Spring Mvc_Servlets - Fatal编程技术网

Spring mvc 如何在Spring组件类中访问HttpServletRequest

Spring mvc 如何在Spring组件类中访问HttpServletRequest,spring-mvc,servlets,Spring Mvc,Servlets,我试图在组件类中访问httpServletRequest。我试过几种方法 @Component public class MyService{ @Resource WebServiceContext wsCtxt; public void myWebMethod(){ MessageContext msgCtxt = wsCtxt.getMessageContext(); HttpServletRequest req = ( (HttpServletRequest)msg

我试图在组件类中访问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。(最终我要做的是从请求头获取客户机主机)。 这有可能吗?。有没有其他办法

方法#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();
我希望这有帮助

方法#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();

我希望这有帮助

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