Фавикон — это значок (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
|
@Configurationpublic 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
|
@Configurationpublic 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
|
@Controllerclass FaviconController { @RequestMapping("favicon.ico") @ResponseBody void favicon() {}} |
Это решит проблему с 404 Not Found но в будущем вам нужно будет помнить об изменении конфигурации, в случае, если вам нужно будет добавить favicon.ico для вашего веб-сайта.
- Конфигурация может быть найдена в Spring MVC Quickstart Archetype на GitHub.