Вопрос или проблема
Я начинал серверное приложение (похожие на RestController) и не хотел, чтобы в пути был токен, такой как "/api/"
. Поэтому мой контроллер перехватывает все, включая запросы к ресурсам ;-(
Существует ли способ определить шаблон, такой как "/content/**"
, который всегда будет рассматриваться как запрос к ресурсу и никогда не будет направлен в мои контроллеры?
Обновление 9.10. 13:49
Это, возможно, дублирует эту тему. Но если я добавлю
spring:
mvc.static-path-pattern: /content/**
в мой application.yml
, запрос https://example.com/content/index.html
все равно будет направлен в @Controller вместо моего статического ресурса.
Ответ или решение
Чтобы правильно настроить маршрутизацию статических ресурсов в Spring Boot, без перенаправления запросов к контроллерам, выполните следующие шаги:
-
Настройка статических ресурсов: Spring Boot автоматически обслуживает статические ресурсы из определенных каталогов. По умолчанию это
src/main/resources/static
,src/main/resources/public
,src/main/resources/resources
, иsrc/main/resources/META-INF/resources
. Если у вас есть статические файлы (например,index.html
), разместите их в одном из этих каталогов. -
Настройка маршрутов для статических ресурсов: В вашем
application.yml
необходимо указать шаблон маршрутов для статических ресурсов. Однако, используя настройкуspring.mvc.static-path-pattern
, необходимо учитывать, что она определяет только путь к ресурсам. Чтобы указать, что запросы к служебному ресурсу/content/**
не должны обрабатываться контроллерами, вам понадобится дополнительно настроить маршрутизацию.
Вот пример того, как настроить файл application.yml
:
spring:
mvc:
static-path-pattern: /content/**
- Служебный контроллер для обработки статических ресурсов:
Если ваш контроллер по умолчанию обрабатывает запросы, вы можете создать контроллер, который будет игнорировать путь /content/**
. Оберните ваш контроллер в настройку для игнорирования этого пути:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class StaticResourceController {
@RequestMapping("/content/**")
public String redirect() {
return "forward:/content";
}
}
Также обратите внимание, что если вам нужно обслуживать статические файлы, такие как index.html
, которая находится в каталоге /content
, то примите во внимание структуру каталогов.
-
Проверьте структуру каталогов: Убедитесь, что вы правильно разместили файлы вашей статической страницы (например,
index.html
) в следующем пути:src/main/resources/static/content/index.html
Тогда запрос на
https://example.com/content/index.html
будет обрабатывать этот файл напрямую. -
Отключение Spring MVC от обработки определенных маршрутов: Если у вас нет необходимости обрабатывать определенные маршруты контроллерами, вы можете использовать
@Controller
только для необходимых маршрутов или использовать аннотацию@RequestMapping
с точно определенными маршрутами в контроллерах.
Следуя данным шагам, вы сможете настроить маршрутизацию статических ресурсов так, чтобы она не конфликтовала с контроллерами, обеспечивая корректную обработку запросов к статическим файлам.