Java Spring HttpRequest获取父URL
我有一个spring应用程序,它有多个通过REST通信的服务。Java Spring HttpRequest获取父URL,java,spring,httprequest,Java,Spring,Httprequest,我有一个spring应用程序,它有多个通过REST通信的服务。 想象简单 @RestController 它在内部调用另一个rest端点 当服务A调用服务B时,会调用服务B,例如[POST]/api/test/serviceb。有没有办法获取此类请求的父URL/端点?我想知道服务B中谁叫它。我怎样才能在春天得到这些信息 我写了一个截取器,它截取每个rest调用,但不知道如何获取每个调用的父url public class AuditRestInterceptor implements Clie
想象简单
@RestController
它在内部调用另一个rest端点
当服务A调用服务B时,会调用服务B,例如[POST]/api/test/serviceb。有没有办法获取此类请求的父URL/端点?我想知道服务B中谁叫它。我怎样才能在春天得到这些信息
我写了一个截取器,它截取每个rest调用,但不知道如何获取每个调用的父url
public class AuditRestInterceptor implements ClientHttpRequestInterceptor{
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution exec)
throws IOException {
// TODO any way to find out who call it ?
}
}
编辑:
我使用HandlerInterceptorAdapter重写我的拦截器,它可以访问HttpServletRequest
public class AuditRestInterceptor extends HandlerInterceptorAdapter implements HandlerInterceptor {
private static Logger log = LoggerFactory.getLogger(AuditRestInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String referer = request.getHeader("Referer");
log.info(referer); // return null
return true;
}
我试过这样简单的电话:
@RestController
@RequestMapping(value = "/api/runtime/case")
public class CaseController {
@Autowired
private CaseService caseService;
@RequestMapping(value = "/{cidla}", method = RequestMethod.GET)
public CaseDto load(@PathVariable("cidla") String cidla) {
return caseService.load(cidla);
}
}
@Component
public class CaseServiceImpl implements CaseService {
@Autowired
private RestTemplate restTemplate;
@Override
public CaseDto load(String cidla) {
String host = "http://localhost:8080";
restTemplate.getForObject(host + "/smart/api/runtime/case/{cidla}/record", RecordDto.class, cidla);
Case c = loadCase(cidla);
return transformCase(c);
}
}
CaseService调用另一个端点,如下所示:
@RestController
@RequestMapping(value = "/api/runtime/case")
public class CaseController {
@Autowired
private CaseService caseService;
@RequestMapping(value = "/{cidla}", method = RequestMethod.GET)
public CaseDto load(@PathVariable("cidla") String cidla) {
return caseService.load(cidla);
}
}
@Component
public class CaseServiceImpl implements CaseService {
@Autowired
private RestTemplate restTemplate;
@Override
public CaseDto load(String cidla) {
String host = "http://localhost:8080";
restTemplate.getForObject(host + "/smart/api/runtime/case/{cidla}/record", RecordDto.class, cidla);
Case c = loadCase(cidla);
return transformCase(c);
}
}
所需的行为-第一次调用/api/runtime/case/{cidla}应将父URL返回为null(我调用它),然后第二次调用/smart/api/runtime/case/{cidla}/record应返回/api/runtime/case/{cidla},因为caseServiceImpl调用它。我截获第二次调用并尝试了它
String referer = request.getHeader("Referer");
但它将返回null。请尝试以下操作:
URL url = new URL(request.getHeader("Referer")); //where request is the HttpServletRequest
System.out.println(url.getPath());
什么是“请求”-我应该导入什么类型的请求?我在谷歌上也剪下了一些代码,但正如我在春季指出的那样,没有“getHeader”,只有getHeaders,它的工作原理完全不同。修改了答案中的评论。谢谢,但是我认为这不会解决我的问题。我更新了我的问题。问题是我的应用程序有数千个rest端点。我找不到访问HttpServletRequest的方法。我已经有了Spring拦截器ClientHttpRequestInterceptor,它可以处理所有rest请求,但是我只能在那里传递springframework.HttpRequest。无法访问HttpServletRequest。或者,我可以做一个自定义的拦截器,在Spring中访问这个对象吗?谢谢你为什么用ClientHttpRequestInterceptor?是否要根据某些条件修改请求?你能试试
HttpHeaders=request.getHeader()吗;headers.get('Referer')
并查看这是否有效。不,它没有类似于“Referer”的内容,它将返回null。然而,我重写了我的拦截器,所以它使用HandlerInterceptor。我重写了可以访问HttpServletRequest的预处理方法。我做了一个简单的演示,其中RestController在内部使用restemplate.getForObject(“/some/other/endpoint”,Pojo.class)。我将捕获此呼叫并尝试header.get('Referer'),但仍然得到null。见更新的问题。谢谢