Spring mvc 如何在Spring组件类中访问HttpServletRequest
我试图在组件类中访问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
@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发送的头中获取主机。