Spring Boot 获取浏览器请求 URL

use*_*191 2 java spring spring-boot

我有一个简单的休息控制器,可以捕获错误。我想获得浏览器发送到服务器的实际 URL,但 servlet 给了我一个不同的 URL。

如果我导航到127.0.0.1/abc404 错误被触发,它被路由到/error定义的处理程序。但是,输出给了我结果127.0.0.1/error而不是127.0.0.1/abc. 如何获取原始网址?

@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";
    }
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*cki 5

您可以定义自己的@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);
}
Run Code Online (Sandbox Code Playgroud)

然后originalUri/error您使用的任何映射实现中读取新属性:

@RequestMapping("/error")
public String error(HttpServletRequest request) {
  System.out.println("ERR: " + request.getAttribute("originalUri"));
  return "ERR";
}
Run Code Online (Sandbox Code Playgroud)

您还可以尝试扩展 Spring MVC 中可用的其他错误处理类来添加此行为,例如ResponseEntityExceptionHandler. 请注意,forward()我的示例中的 可能被认为是肤浅的,因为可以返回ResponseEntityfrom @ExceptionHandler