【问题标题】:Spring Boot Web app - Redirect controllerSpring Boot Web 应用程序 - 重定向控制器
【发布时间】:2016-08-29 10:07:05
【问题描述】:

我需要一个控制器(或其他组件)来处理所有 404 错误并巧妙地重定向到正确的页面(这基于表 src/ 目标)。我发现了一些关于处理 FROM 控制器抛出的异常的问题,所以我做了以下几点:

@ControllerAdvice
public class ServiceExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(Throwable.class)
    @ResponseBody
    ResponseEntity<String> handleControllerException(HttpServletRequest req, Throwable ex) {

        String slug = req.getRequestURI(); // this is the URL that was not found
        URI location=null;
        try {
            // lookup based on slug ...
            location = new URI("http://cnn.com"); // let's say I want to redirect to cnn
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setLocation(location);
        return new ResponseEntity<String>("Page has permanently moved", responseHeaders, HttpStatus.PERMANENT_REDIRECT);


    }
}

我没有进行任何其他配置更改

这有两个问题:

  • 它只捕获我的其他控制器抛出的异常,而不是 404 错误
  • 它捕获所有类型的异常,而不仅仅是 404

关于如何实现一种“包罗万象”的任何想法?

【问题讨论】:

标签: spring spring-mvc error-handling spring-boot http-status-code-404


【解决方案1】:

这可能不是最好的 Spring boot 解决方案,但也许可以从中推断出类似的想法并将其应用于您的应用程序。我在使用 Spring 3.x 时遇到了类似的问题,这是我想出的解决方案。

我的场景是我有多个 servlet 在同一个应用程序上下文下运行。其中一个处理 Web 界面,另一个处理 API 调用。我希望处理 API 调用的 servlet 以不同于 UI servlet 的方式处理 404。

我创建了一个扩展 DispatcherServlet 的新类,并重写了 noHandlerFound 方法。我在 &lt;servlet&gt;tags 的 web.xml 中连接了我的新类,而不是我之前在那里的默认 DispatcherServlet 类。

<servlet>
    <servlet-name>api-servlet</servlet-name>
    <servlet-class>path.to.your.new.DispatcherServletClass</servlet-class>
    ...
</servlet>

【讨论】:

  • 这不是“引导”方式。您的代码只是一个 servlet 定义。除非修复,否则我会否决它。
猜你喜欢
  • 2020-03-22
  • 2016-01-24
  • 2019-01-03
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
相关资源
最近更新 更多