Spring Boot:覆盖favicon

我如何覆盖Spring Boot的图标?

注意 :这是我另一个问题,提供了另一个不涉及任何编码的解决scheme: 春季启动:是否有可能使用外部application.properties文件在任何目录与一个胖的jar? 这是为application.properties,但它也可以应用到favicon。 事实上,我现在正在使用该方法来进行favicon覆盖。

如果我实现了一个具有@EnableWebMvc的类,那么Spring Boot的WebMvcAutoConfiguration类将不会加载,并且可以通过将其放置到静态内容的根目录中来服务于我自己的图标。

否则,WebMvcAutoConfiguration注册faviconRequestHandler bean(请参阅源https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ web / WebMvcAutoConfiguration.java ),它提供了放在Spring Boot主资源目录中的“绿叶”图标。

我怎样才能覆盖它没有实现一个具有@EnableWebMvc我自己的类,从而禁用WebMvcAutoConfiguration类的Spring Boot的整个默认configurationfunction?

此外,因为我想在客户端(networking浏览器)尽快更新图标文件,所以我想将favicon文件的caching周期设置为0.(如下面的代码,我正在使用'静态'webapp内容和脚本文件,在更改文件后,必须尽快在客户端更新。)

public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("/") .setCachePeriod(0); } 

所以,只要find保存favicon.ico文件的地方,Spring Boot的faviconRequestHandler荣誉可能是不够的。

UPDATE

现在我知道我可以通过将favicon文件放到src / main / resources目录来覆盖默认的。 但caching期问题仍然存在。
此外,最好把favicon文件放在静态网页文件放置的目录下,而不是资源目录。

UPDATE

好吧,我设法覆盖默认的一个。 我所做的是如下:

 @Configuration public class WebMvcConfiguration { @Bean public WebMvcConfigurerAdapter faviconWebMvcConfiguration() { return new FaviconWebMvcConfiguration(); } public class FaviconWebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.setOrder(Integer.MIN_VALUE); registry.addResourceHandler("/favicon.ico") .addResourceLocations("/") .setCachePeriod(0); } } } 

基本上,我通过调用registry.setOrder(Integer.MIN_VALUE)通过添加具有最高顺序的资源处理程序来覆盖默认值。

由于Spring Boot中的缺省值具有顺序值(Integer.MIN_VALUE + 1)(请参阅https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/中的 FaviconConfiguration类src / main / java / org / springframework / boot / autoconfigure / web / WebMvcAutoConfiguration.java )我的处理程序获胜。

这个可以吗? 有另一种方式(比我做的更温和)?

UPDATE

这不好。 当我调用registry.setOrder(Integer.MIN_VALUE) ,实际上我提高了所有资源处理程序的优先级。 所以,当我将下面的代码添加到另一个WebMvcConfigurerAdapter ,实际上所有的http请求都被引导到该资源处理程序,从而阻止了Java代码的任何dynamic处理。

 public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("/") .setCachePeriod(0); } 

需要另一个解决scheme。

UPDATE

现在,我找不到覆盖Spring Boot提供的faviconfunction的方法。
也许有一种方法添加我自己的HandlerMapping bean,但我不知道该怎么做。

现在我可以select以下选项之一:

  1. 有一个具有@EnableWebMvc的类,从而禁用Spring Boot WebMvcAutoConfiguration类。 (我可以复制WebMvcAutoConfiguration类的代码并删除faviconfunction)
  2. 放弃将favicon文件放置在任意位置的自由,并将其放置到Spring Boot的faviconfunction所需的资源目录中。 并忽略caching问题。

但是这两种select都不令人满
我只是想把我的静态网页文件(可以是任何目录,因为我可以改变文档根目录)的favicon文件,并解决caching问题。
我错过了什么吗?
任何build议将不胜感激。

UPDATE

顺便说一句,我想改变favicon和其他静态文件的位置的原因如下。 目前主要是开发环境问题。

我正在构build一个单页的Web应用程序(SPA)。

库/框架:

  • 对于服务器端,我使用Spring。 (当然)
  • 对于客户端(networking浏览器)方面,我使用AngularJS。

工具:

  • 对于服务器端,我使用Spring Tool Suite。
  • 对于客户端,我使用WebStorm。

主目录结构:

 ProjectRoot\ src\ bin\ build\ webapp\ build.gradle 
  • src:我的Spring java源文件驻留在哪里。
  • bin:Spring Tool Suite放置其构build输出的地方。
  • 构build:“Gradle构build”放置其构build输出的位置。
  • webapp:我的客户端源文件(.js,.css,.htm和favicon)所在的位置。 因此这是WebStorm项目目录。 (如有必要,我可以更改目录名称)

我想要的是:

  • 为了能够修改和testing我的客户端代码,而无需重build/重新启动我的Spring服务器应用程序。 所以,客户端代码不能放入jar文件中。 反正Spring Tool Suite根本不会构build一个jar文件(至less对于当前的configuration)
  • 为了能够用客户端代码testing我的Spring服务器应用程序,可以在Spring Tool Suite输出和gradle输出之间轻松切换。 因此,客户端代码必须可以从build子目录中的服务器应用程序(实际上build\libs )和服务器应用程序在bin目录中访问。
  • 当我修改客户端代码时,它必须立即可用于Web浏览器。 所以浏览器不能无限期地caching,并且总是要求服务器进行更新。
  • 部署时,客户端代码必须是可修改的,无需重build/重新启动服务器应用程序。 所以客户端代码不能放入jar文件中。

关于caching问题:

如果在addResourceHandlers()上没有setCachePeriod(0),Google Chrome将无限期地caching文件,而不要求服务器进行更新。 它甚至不连接到服务器。 (Google的工程师说这种行为是正确的。)所以,我所能做的就是手动清除浏览器caching。 开发环境令人沮丧,生产环境难以接受。

BTW,Node.js上的express.js模块提供了合理的默认HTTP头,以便Google Chrome向服务器请求更新。 当我回顾Spring和express.js使用Fiddler生成的HTTP标头时,它们是不同的。

任何改善我的环境的build议,将不胜感激。
由于我是Spring初学者,我可能会错过一些东西。

UPDATE

最后我有一个工作代码。 具体如下:

 @Configuration public static class FaviconConfiguration { @Bean public SimpleUrlHandlerMapping myFaviconHandlerMapping() { SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); mapping.setOrder(Integer.MIN_VALUE); mapping.setUrlMap(Collections.singletonMap("/favicon.ico", myFaviconRequestHandler())); return mapping; } @Autowired ApplicationContext applicationContext; @Bean protected ResourceHttpRequestHandler myFaviconRequestHandler() { ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler(); requestHandler.setLocations(Arrays .<Resource> asList(applicationContext.getResource("/"))); requestHandler.setCacheSeconds(0); return requestHandler; } } 

注意bean名称。 我添加了“我的”,以避免名称冲突。
自动assembly应用程序上下文本身看起来很尴尬,但它是模仿org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration.addResourceLocations()的代码的必要条件。

现在我有一个没有caching问题的图标处理程序,我可以将favicon文件放在任何我想要的地方。
谢谢。

您可以将自己的favicon.ico放在类path的根目录或任何静态资源位置(例如classpath:/static )中。 您也可以使用单个标志spring.mvc.favicon.enabled=false完全禁用faviconparsing。

或者为了完全控制,你可以添加一个HandlerMapping(只需从Boot中复制一个并赋予它一个更高的优先级),例如

 @Configuration public static class FaviconConfiguration { @Bean public SimpleUrlHandlerMapping faviconHandlerMapping() { SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); mapping.setOrder(Integer.MIN_VALUE); mapping.setUrlMap(Collections.singletonMap("mylocation/favicon.ico", faviconRequestHandler())); return mapping; } @Bean protected ResourceHttpRequestHandler faviconRequestHandler() { ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler(); requestHandler.setLocations(Arrays .<Resource> asList(new ClassPathResource("/"))); return requestHandler; } } 

这对我来说没有必要。

为什么在使用生成的JAR打包资源时会覆盖缺省值,这将比缺省值更高的优先级。

为了实现一个自定义的favicon.ico文件,我为我的应用程序创build了一个src/main/resources目录,然后将favicon.ico文件复制到那里。 这个资源目录中的文件被移动到已编译的JAR的根目录,因此在Spring提供之前find了你自定义的favicon.ico

完成上述操作与上面更新的解决scheme达到了相同的效果。

请注意,从v1.2.0开始,你也可以把这个文件放在src/main/resources/static

我真的很喜欢Springboot,因为总体来说它充满了聪明的解决scheme,但我拒绝注册一个应用程序bean来提供一个favicon,因为这只是愚蠢的。

我刚刚在我的HTML页面头添加了我自己的favicon链接,就像这样。

 <link rel="icon" type="image/png" href="images/fav.png"> 

然后,我重新命名我的图标,并将其放置在

 <ProjFolder>/src/main/resources/statichttp://img.dovov.comfav.png 

现在我在Chrome和Firefox浏览器选项卡和Safari浏览器地址栏中有一个图标,而不必使用Spring和Java,而且我不应该在较新的版本中为这种微不足道的function追逐对Springboot的更改。

由于Spring Boot 1.2.2和1.1.11,您可以使用spring.mvc.favicon.enabled = false属性轻松地禁用默认图标。

欲了解更多信息,请访问:

较新版本的Boot(当然是1.2,也可能是1.1.8)允许你在你的静态资源里放一个favicon.ico。

。registry.addResourceHandler( “/ robots.txt的”)addResourceLocations( “/”);

。registry.addResourceHandler( “/的favicon.ico”)addResourceLocations( “/”);

robots.txt,favicon.ico文件位置:/ src / main / resources

我用春季启动1.2.1