我正在尝试访问组件类中的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。 (最终我要做的是从请求标题获取客户端主机)。 这可能吗?这有什么替代方案吗?
答案 0 :(得分:0)
您是否尝试将请求对象作为参数传递给服务方法,并从服务传递到组件方法?
// 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
}
此外,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'
我希望这有帮助!