从ErrorController进行Spring重定向

时间:2019-05-23 19:31:33

标签: spring-boot spring-mvc

我有许多通用错误页面,除了我可以控制的页面以外,其他多个应用程序都在使用这些页面。我想配置Spring Boot错误控制器以重定向到这些页面之一。不幸的是,它不起作用。

例如。

  @Controller  
  public class MyCustomErrorController implements ErrorController {

    @GetMapping(value = "/error")
    public String handleError(HttpServletRequest request) {
      Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

      if (status != null) {
        Integer statusCode = Integer.valueOf(status.toString());

        if (statusCode == HttpStatus.NOT_FOUND.value()) {
          return "redirect:https://www.example.com/error-404";
        }
      }

      return "redirect:https://www.example.com/error-500";
    }

    @Override
    public String getErrorPath() {
      return "/error";
    }
  }

例如,如果我有意输入了错误的URL,则可以看到响应包含带有我期望的404 URL的Location标头,但浏览器实际上并未重定向。有什么想法可以在自定义ErrorController中进行重定向吗?

这可能是因为我正在尝试从本地主机进行测试,而Strict-Transport-Security忽略了响应Location标头值(位于FQDN上)吗?

3 个答案:

答案 0 :(得分:0)

如何将HttpServletResponse添加到方法param并将其用于重定向?

HttpServletResponse response;       
response.sendRedirect("https://www.example.com/error-404");

引用HERE

答案 1 :(得分:0)

application.proerties文件中添加以下属性

server.error.whitelabel.enabled=false

答案 2 :(得分:0)

尝试一下。

  @Controller  
  public class MyCustomErrorController implements ErrorController {

    @GetMapping(value = "/error")
    public String handleError(HttpServletRequest request) {
      Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

      if (status != null) {
        Integer statusCode = Integer.valueOf(status.toString());

        if (statusCode == HttpStatus.NOT_FOUND.value()) {
          return "redirect:/error-404"; //remove your https://www.example.com
        }
      }

      return "redirect:/error-500";
    }

    @Override
    public String getErrorPath() {
      return "/error";
    }
  }

** 编辑 **
更改网址映射,然后重试:
错误404->错误/ 404
error-500->错误/ 500

@Controller  
  public class MyCustomErrorController implements ErrorController {

    @GetMapping(value = "/error")
    public String handleError(HttpServletRequest request) {
      Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

      if (status != null) {
        Integer statusCode = Integer.valueOf(status.toString());

        if (statusCode == HttpStatus.NOT_FOUND.value()) {
          return "redirect:/error/404"; //remove your https://www.example.com
        }
      }

      return "redirect:/error/500";
    }

    @Override
    public String getErrorPath() {
      return "/error";
    }
  }  

错误/ 404

@GetMapping("/error/404")

错误/ 500

@GetMapping("/error/500")