java - 排除 Spring MVC Controller 的请求映射中的某些路径

标签 java spring spring-mvc

我目前正在尝试创建一个 Controller 来处理全局所有未知的 URL。所以我所做的是创建一个类似于下面的 Controller

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/**")
public class UnknownUrlController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String getError404() {
        return "/error404";
    }
}

我的目的是确保不调用仅向浏览器返回字符串“Not Found”的默认 servlet。该策略有效,因为所有未知 URL 均由该 Controller 处理。

但是问题是,我在 WebMvcConfigurerAdapter 中配置的所有静态资源(图像、js 和 css 文件)也调用了 Controller ,如下所示

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/css/**").addResourceLocations("/css/");
    registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    registry.addResourceHandler("/img/**").addResourceLocations("/img/");
}

因此,我的错误页面代替了向浏览器提供的静态文件。尽管我后来从这个 answer 了解到 Controller 映射优先于静态资源。 。这就是我想知道如何排除我的资源 url 映射不被该 Controller 处理的原因,这样它就只关心捕获未知的 URL。

在继续执行此策略之前,我尝试了一些其他我无法正常工作的事情(我可能错过了一些东西)

  1. 将 DispatcherServlet 的 throwExceptionIfNoHandlerFound 字段设置为 true,以便在找不到 URL 映射的处理程序时抛出异常,然后将其全局处理为描述here 。然而,似乎总是为未知路径(/**)分配默认处理程序,因此不会抛出异常。
  2. 创建了 application.properties 文件并设置 spring.mvc.throw-exception-if-no-handler-found=true。

我的所有配置都是基于 Java 的,没有任何 xml 文件,并且希望保持这种方式。

最佳答案

有一种更好的方法在 Spring 中编写自定义错误处理程序。请参阅下面的内容:

@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleResourceNotFoundException() {
    return "notfound";
}

It as a nice blog entry about exception handlers in Spring MVC.

如果 DispatcherServlet 在 404 情况下没有抛出异常,那么您应该使用 DispatcherServlet 的 setThrowExceptionIfNoHandlerFound() 方法将其打开。

Here you can find more information about, how to turn it on

关于java - 排除 Spring MVC Controller 的请求映射中的某些路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42552501/

相关文章:

Java/Tomcat 调试 (SSL) - 使用哪个日志文件?

java - 以静默方式将作业返回到队列

javascript - 如何在 Ajax 中发送 js 数组

spring - Spring MVC 中的安全 RESTful Web 方法

spring-mvc - spring mvc 3 找不到带有 URI 的 HTTP 请求的映射

java - 整数值没有得到刷新

java - 正则表达式模式匹配不适用于 java 中的特定字符串

java - 签名声明抛出异常 : A method/constructor shouldn't explicitly throw java. lang.Exception

javascript - 如何将 Javascript 日期转换为 Spring @RequestParam 的 LocalDate?

java - Mockito SpyBean 抛出 UnfinishedStubbingException