java - Spring Boot获取浏览器请求URL

标签 java spring spring-boot

我有一个简单的休息 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/

相关文章:

java - 由于缺少/而未创建文件夹?

java - 从命令提示符运行时,maven 不运行主类

java - 如何检查连接是否是性能瓶颈

java - SpringAMQP - 如何捕获 ListenerExecutionFailedException?

java - 如何在 <form :select>? 中使用占位符属性

java - Spring mongo 查询设置自定义超时

spring-boot - 无法从Kubernetes中的其他服务访问Spring Boot后端服务

java - 如何在同一台服务器上运行两个 spring boot 应用程序?

Java `InvocationTargetException` 通过反射进行类实例化

java - 堆栈跟踪警告 "No bean factory"