Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Java Spring HttpRequest获取父URL_Java_Spring_Httprequest - Fatal编程技术网

Java Spring HttpRequest获取父URL

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

我有一个spring应用程序,它有多个通过REST通信的服务。
想象简单

@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。见更新的问题。谢谢