Статьи

Настройте favicon.ico в приложении Spring MVC

Фавикон — это значок (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 для вашего веб-сайта.