spring mvc 捕获所有路线,但只捕获未知路线

Posted

技术标签:

【中文标题】spring mvc 捕获所有路线,但只捕获未知路线【英文标题】:spring mvc catch all route but only unknown routes 【发布时间】: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 场景适合我 【参考方案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,在您的控制器中捕获它并推送到所需的位置。

【讨论】:

我没有 web.xml,因为它是一个 Spring Boot 应用程序。我如何在 Spring Boot 中做到这一点? 参考sporcic.org/2014/05/custom-error-pages-with-spring-boot这个链接,可能会有帮助。

以上是关于spring mvc 捕获所有路线,但只捕获未知路线的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC 路由捕获所有 *.aspx 请求

捕获 MVC 3.0 应用程序中抛出的所有错误的干净方法?

捕获未知异常

混合 SPA 和 ASP.NET MVC 路由

Spring 捕获 index.html 的所有路由

ContextException:无法捕获未知禁令(Discord Java)