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 捕获所有路线,但只捕获未知路线的主要内容,如果未能解决你的问题,请参考以下文章