如何在Spring组件类中访问HttpServletRequest

时间:2018-06-15 03:28:22

标签: spring-mvc servlets

我正在尝试访问组件类中的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始终为null。然后我在Web服务类中尝试了相同的代码。那个代码正在运行。我要求它在组件类中获取HttpServletRequest。 (最终我要做的是从请求标题获取客户端主机)。 这可能吗?这有什么替代方案吗?

1 个答案:

答案 0 :(得分:0)

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

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

你也可以压缩它:

management:
  endpoints:
    web:
      exposure:
        include: 'health,info,metrics,customendpoint'

我希望这有帮助!