我有一个简单的休息 Controller 来捕获错误。我想获取浏览器发送到服务器的实际 URL,但 servlet 给了我一个不同的 URL。
如果我导航到 127.0.0.1/abc
,则会触发 404 错误,并将其路由到定义的 /error
处理程序。但是,输出给出的结果是 127.0.0.1/error
而不是 127.0.0.1/abc
。如何获取原始URL?
@RestController
public class IndexController implements ErrorController {
@RequestMapping("/")
public String index() {
return "OK";
}
@RequestMapping("/error")
public String error(HttpServletRequest request) {
System.out.println("ERR: " + request.getRequestURL() + " : " + request.getRequestURI());
return "ERR";
}
@Override
public String getErrorPath() {
return "/error";
}
}
最佳答案
您可以定义自己的 @ExceptionHandler
,它将在由 /error
映射处理之前将原始请求 URI 作为请求的属性保存:
@ExceptionHandler(Exception.class)
public void handleException(HttpServletRequest req, HttpServletResponse resp) throws Exception {
req.setAttribute("originalUri", req.getRequestURI());
req.getRequestDispatcher("/error").forward(req, resp);
}
然后在您使用的任何 /error
映射实现中读取新的 originalUri
属性:
@RequestMapping("/error")
public String error(HttpServletRequest request) {
System.out.println("ERR: " + request.getAttribute("originalUri"));
return "ERR";
}
您还可以尝试扩展 Spring MVC 中可用的其他错误处理类来添加此行为,例如ResponseEntityExceptionHandler
。请注意,我的示例中的 forward()
可能被认为是肤浅的,因为可以从 @ExceptionHandler
返回 ResponseEntity
。
关于java - Spring Boot获取浏览器请求URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49825438/