【问题标题】:Spring Boot get the browser request URLSpring Boot 获取浏览器请求 URL
【发布时间】:2018-09-24 07:29:02
【问题描述】:

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

如果我导航到 127.0.0.1/abc,则会触发 404 错误,并按照定义将其路由到 /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";
    }
}

【问题讨论】:

  • 您可能希望创建一个带有@ControllerAdvice 注释的类,并使用@ExceptionHandler 注释来捕获Spring Boot 为404 引发的异常并以这种方式处理它。以下答案提供了一个示例:stackoverflow.com/a/45510975/2535264

标签: java spring spring-boot


【解决方案1】:

您可以定义自己的@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

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2023-03-23
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多