Фавикон — это значок (favicon.ico), связанный с вашим сайтом. Не каждый сайт использует favicon. Но большинство браузеров не заботятся об этом, и они в любом случае делают запрос на это. Если favicon не установлен, сервер вернет ненужную ошибку 404 Not Found
.
В типичном приложении Spring MVC сначала нужно настроить фильтр безопасности, чтобы он разрешал все запросы к favicon.ico, потому что Spring Security кэширует запросы пользователя, включая запрос favicon.ico. После успешной аутентификации Spring Security перенаправит нас на этот ресурс с ошибкой. Чтобы избежать этого, мы настраиваем фильтр безопасности следующим образом:
01
02
03
04
05
06
07
08
09
10
11
|
< security:http auto-config = "true" disable-url-rewriting = "true" use-expressions = "true" > < security:form-login login-page = "/signin" authentication-failure-url = "/signin?error=1" /> < security:logout logout-url = "/logout" invalidate-session = "false" /> < security:intercept-url pattern = "favicon.ico" access = "permitAll" /> < security:intercept-url pattern = "/" access = "permitAll" /> < security:intercept-url pattern = "/error" access = "permitAll" /> < security:intercept-url pattern = "/resources/**" access = "permitAll" /> < security:intercept-url pattern = "/signin" access = "permitAll" /> < security:intercept-url pattern = "/signup" access = "permitAll" /> < security:intercept-url pattern = "/**" access = "isAuthenticated()" /> </ security:http > |
Конфигурация гарантирует, что при запросе favicon.ico аутентификация не требуется. Этот прием не позволяет нам увидеть 404 Not Found
после входа в приложение.
Обычно это все, что нам нужно, чтобы 404 Not Found
«исчез» в приложении Spring MVC / Spring Security. Но на самом деле клиент все равно будет искать этот ресурс, а сервер вернет ошибку 404 Not Found
.
Есть несколько способов, если мы не хотим использовать favicon для нашего сайта, чтобы сервер не возвращал ошибку по запросу.
Вероятно, самый простой способ — добавить «пустой» favicon.ico к вашим статическим ресурсам и позволить серверу обслуживать этот файл по запросу. В приведенной ниже конфигурации Spring обрабатывает статические ресурсы из каталога /resources/
который отображается в путь /resources/**
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { private static final String RESOURCES_HANDLER = "/resources/" ; private static final String RESOURCES_LOCATION = RESOURCES_HANDLER + "**" ; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(RESOURCES_HANDLER).addResourceLocations(RESOURCES_LOCATION); } } |
Файл favicon.ico может быть добавлен в каталог resource/images
, но затем и дополнительный @Controller
должен быть создан для пересылки любого запроса favicon.ico на фактическую иконку. Я делаю это со статическим классом в моей конфигурации:
01
02
03
04
05
06
07
08
09
10
11
12
|
@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Controller static class FaviconController { @RequestMapping ( "favicon.ico" ) String favicon() { return "forward:/resources/images/favicon.ico" ; } } } |
Как это работает? Когда клиент запрашивает localhost:8080/favicon.ico
, контроллер передает запрос статическому ресурсу. В будущем, когда вам понадобится файл favicon.ico для вашего сайта, просто замените файл в каталоге resources/images
и все готово.
Другой способ, о котором я недавно думал, это добавить @Controller
, у которого есть единственный метод, возвращающий пустой @ResponseBody
:
1
2
3
4
5
6
|
@Controller class FaviconController { @RequestMapping ( "favicon.ico" ) @ResponseBody void favicon() {} } |
Это решит проблему с 404 Not Found
но в будущем вам нужно будет помнить об изменении конфигурации, в случае, если вам нужно будет добавить favicon.ico для вашего веб-сайта.
- Конфигурация может быть найдена в Spring MVC Quickstart Archetype на GitHub.