【问题标题】:spring mvc catch all route but only unknown routesspring mvc 捕获所有路线,但只捕获未知路线
【发布时间】:2015-04-19 14:09:24
【问题描述】:

我有一个前端带有 angular 的 spring boot 应用程序。

我正在使用带有 html5 模式的 ui-router,我希望 spring 在所有未知路由上呈现相同的 index.html。

// Works great, but it also overrides all the resources
@RequestMapping
public String index() {
    return "index";
}

// Seems do be the same as above, but still overrides the resources
@RequestMapping("/**")
public String index() {
    return "index";
}

// Works well but not for subdirectories. since it doesn't map to those
@RequestMapping("/*")
public String index() {
    return "index";
}

所以我的问题是如何创建一个后备映射,但它可以让资源通过?

【问题讨论】:

  • 你需要使用 HandlerInterceptor 才能做到这一点
  • tcharaf 场景适合我

标签: angularjs spring spring-mvc spring-boot


【解决方案1】:

我发现最简单的方法是实现自定义 404 页面。

@Configuration
public class MvcConfig {

    @Bean
    public EmbeddedServletContainerCustomizer notFoundCustomizer(){
        return new NotFoundIndexTemplate();
    }

    private static class NotFoundIndexTemplate implements EmbeddedServletContainerCustomizer {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/"));
        }
    }
}

Neil McGuigan 提出了一个 HandlerInterceptor,但我无法理解它是如何实现的。我不太高兴看到这将如何实现,因为使用 html5 历史推送状态的单页应用程序将需要这种行为。而且我还没有真正找到解决这个问题的任何最佳做法。

【讨论】:

    【解决方案2】:

    尝试在您的控制器中使用@ExceptionHandler,将 Exception.class 更改为您要处理的异常的类。

    @ExceptionHandler(value = {Exception.class})
    public String notFoundErrorHandler() {
      return "index";
    }
    

    【讨论】:

    • 它似乎不起作用,我和问题创建者有同样的问题,这种情况对我来说失败了
    • 你的问题到底是什么?
    • 感谢提问,我的问题已经解决了。问题在于这种构造冲突并在 mvc configurrer 中覆盖了 configureDefaultServletHandling 方法
    【解决方案3】:

    您可以在 404 处理程序中处理所有不匹配的请求。看看this,有几种选择

    您可以做的另一件事是覆盖DefaultAnnotationHandlerMapping,并通过设置defaultHandler 属性添加一种全能控制器。

    public void setDefaultHandler(Object defaultHandler)
    设置此处理程序映射的默认处理程序。如果未找到特定映射,则将返回此处理程序。 默认为null,表示没有默认处理程序。

    【讨论】:

    • DefaultAnnotationHandlerMapping 在 Spring 3.2 中已弃用,取而代之的是 RequestMappingHandlerMapping。我在新处理程序中找不到 defaultHandler :(
    • 其实defaultHandler是在AbstractHandlerMapping中定义的,RequestMappingHandlerMapping也是扩展的,所以应该还是可以的。
    【解决方案4】:

    为 web.xml 文件中的所有 url 定义一个入口点,如下所示:

    <error-page> 
        <error-code>404</error-code>
        <location>/Error_404</location>
    </error-page>
    

    这将捕获所有 404 即页面未找到错误并抛出 /Error_404 url,在您的控制器中捕获它并推送到所需的位置。

    【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2012-06-12
    • 2016-10-19
    • 2018-01-28
    • 2019-06-29
    • 2015-12-31
    • 1970-01-01
    • 2017-01-12
    • 2020-12-03
    相关资源
    最近更新 更多