17

I know this question has been asked over and over here and there are several solutions. I've tried several of those except the ones that suggests writing you own configuration bean for this. I don't want to do all that just to display a tiny icon it seams overkill. But I can not get it to work. These are the solutions I've tried so far.

  1. just add favicon.ico under static resources and it should work....it doesn't.
  2. spring.mvc.favicon.enabled=false in application.properties, no favicon showed at all (which I guess is the whole point of that).
  3. Tried 2 examples of including the favicon as a link in the html pages. Like so: <link rel="icon" type="image/png" href="favicon.png" /> <link rel="icon" type="image/x-icon" href="favicon.ico" />

Neither of those work.

  1. Tried renaming my own favicon to something else and reference it as above. Does not work.

When inspecting the page in the browser I sometimes get no error at all printed out despite no icon showing, or I get an error saying GET http://localhost:8080/myapp/favicon.png 404 () Where it is refering the type as JSON (which I find strange).

I'm running out of ideas here so if anyone can tell me why this is not working please let me know. Did I perhaps forget one of those magic spring annotations? This is what my main class looks like.

@SpringBootApplication 
@ComponentScan
@Configuration
@EnableWebMvc
public class JobengineMonitorApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(JobengineMonitorApplication.class, args);
    }

 }

I am using thymeleaf as the template engine

Johan Fredin
  • 573
  • 2
  • 5
  • 12

11 Answers11

16

I solved this problem by putting favicon.ico in main/resource/static and adding this lines to my security config

 httpSecurity
            .authorizeRequests()
                .antMatchers( "/favicon.ico").permitAll()
JaneXQ
  • 380
  • 1
  • 3
  • 9
10

I have this with SpringBoot configuration too and is working

<link rel="shortcut icon" type="image/png" th:href="@{/img/favicon.png}"/>

And the favicon.png under resources/public/img

cralfaro
  • 5,822
  • 3
  • 20
  • 30
5

If anyone faces the same problem using newer version of Spring (in my case spring boot 2.4.4), here's the scenario that worked fine for me:

  1. Put the favicon.ico in the /resources/static folder. I also tried to put it just in the /resourses/ folder and it worked fine as well, so do not worry about the folder that much.
  2. Create a FaviconConfiguration in your configurations folder with the following content:
@Configuration
public class FaviconConfiguration {

    @Bean
    public SimpleUrlHandlerMapping customFaviconHandlerMapping() {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setOrder(Integer.MIN_VALUE);
        mapping.setUrlMap(Collections.singletonMap(
                "/static/favicon.ico", faviconRequestHandler()));
        return mapping;
    }

    @Bean
    protected ResourceHttpRequestHandler faviconRequestHandler() {
        ResourceHttpRequestHandler requestHandler
                = new ResourceHttpRequestHandler();
        requestHandler.setLocations(Collections.singletonList(new ClassPathResource("/")));
        return requestHandler;
    }
}
  1. In case you use Spring Security don't forget to add antMatcher for your favicon resource by adding the following code to your SpringSecurityConfiguration (as JaneXQ already mentioned above):
.antMatchers("/static/favicon.ico").permitAll()
  1. Use link to your custom favicon explicitly in your html. To do that just put the following link in the <head> section of each of your html pages in the following way (I used thymeleaf in here):
<head>
    ...
    <link rel="icon" type="image/ico" th:href="@{../static/favicon.ico}">
    ...
</head>
3

I found I had to put my favicon.ico file in:

src/main/resources/public
Bohemian
  • 412,405
  • 93
  • 575
  • 722
3

Put your favicon.png under src/main/resources/public and add this to your *.html page exactly in the header section

 <link rel="shortcut icon" type="image/png" th:href="@{favicon.png}"/>
Ikbel
  • 1,817
  • 1
  • 17
  • 30
2

I saved my favicon which was a simple .png download as src/main/resources/static/favicon.ico

I couldn't get it to display until I tried another browser and it worked fine - so try clearing the browser cache, or try testing on another browser

oldbird
  • 21
  • 1
  • Great reminder - clear the browser cache after trying some of these solutions! I tried multiple solutions (who knows how many would have worked) but only after clearing the browser cache did my favicon appear. For me, I did not have to configure a custom favicon bean, so try the simpler fixes, clear the cache, and see if that works! – TheKearnol Feb 05 '22 at 19:11
1

Ok so this appears to be working now. Of course I managed to get it working just after ranting about it :).

Anyway, what i did was.

  1. Remove @EnableWebMvc from the main class
  2. For added ../ to the href depending on the urls e.g /index was fine but /edit/something.html was not

Sorry for wasting peoples time but hopefully this could be useful for another rookie like me

Johan Fredin
  • 573
  • 2
  • 5
  • 12
  • did you try the solution i proposed? Is something is working in my project and seems quite easy and no configuration – cralfaro Sep 20 '17 at 08:50
  • Why did you remove EnableWebMVC ? Did you get your attempt (1) to work? setting "favico.ico" in static resources. I am having issues with that. – JayC Jan 28 '20 at 16:21
1

Try to replace th:href with href. It worked for me.

<link rel="icon" href="/favicon.ico" type="image/ico">
roy ren
  • 11
  • 1
0

For some reason .ico format was not working. I just placed a png image instead and spring automatically picked the favicon.

I placed the png image in \src\main\resources\public

Spring boot + thymeleaf

Arv
  • 427
  • 4
  • 6
0

I had the same issue and fix it removing @EnableAdminServer annotation

horelvis
  • 125
  • 5
0
  • Spring boot
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.6'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.security.web'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
 <link rel="shortcut icon" type="image/x-icon" th:href="@{favicon.ico}"/>
  • src/main/resources/static/favicon.ico

  • spring security

@EnableWebFluxSecurity
@Configuration
public class WebSecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity httpSecurity) {
        return httpSecurity
                .formLogin().and()
                .httpBasic().disable()
                .authorizeExchange()
                .pathMatchers("/", "/login", "/signup").permitAll()
                .pathMatchers(HttpMethod.POST, "/api/users").permitAll()
                .pathMatchers("/favicon.ico").permitAll()
                .pathMatchers(HttpMethod.GET, "/api/users/**").hasRole("ADMIN")
                .anyExchange().authenticated()
                .and()
                .build();
    }
}
skyho
  • 1,438
  • 2
  • 20
  • 47