Spring @RequestMapping(“/favicon.ico”) does not work when requested from index.html
我以前没有找到favicon.ico的映射,所以决定处理它。
对我来说,最简单的方法是在控制器方法@RequestMapping(" / favicon.ico")中添加一个动作。
我不再收到这些投诉(尽管我自己没有在html文件中请求favicon.ico,但我猜浏览器会自动执行此操作)。
当我访问http:// localhost:8080 / favicon.ico时,动作被击中!
我将以下内容添加到我的html文件中:
1
| <link href="/favicon.ico" rel="icon" type="image/x-icon" /> |
但是动作永远不会被击中。
我也尝试过
1
| <link href="http://localhost:8080/favicon.ico" rel="icon" type="image/x-icon" /> |
但是动作没有被击中。
我怀疑这与get / post请求有关,当我手动从浏览器中请求它时,会发出一个get请求。当从html文件中获取其他信息时,Spring将无法识别。
请不要推荐我这样做:
1
| <mvc:resources mapping="/favicon.ico" location="/favicon.ico" /> |
我喜欢从控制器执行
,因为我在那里有一些逻辑。
会涉及一些缓存吗?
编辑:
我还应该提到我一直在获取tomcat网站图标。从未有人要求在favicon.ico上看到任何信息。
是tomcat默认提供它,而忽略将其击中/转发给我的动作吗?
- 打开浏览器的网络控制台,并在单击链接时准确检查发送了什么请求。
-
另外,启用Spring的DEBUG日志记录,看看Spring在做什么。
-
@SotiriosDelimanolis我在浏览器网络中看不到任何内容,提示曾经有人请求favicon.ico,这可以解释为什么我的动作没有被执行。但是我不认为网络信息通常包含该信息。 Favicon很特别。我还要提到的是,我一直在获取tomcat favicon.ico徽标。也没有具体说明。
-
您确定要将请求发送到http://localhost:8080/favicon.ico吗?您的应用的上下文路径是否真的为空?
-
请注意,如果我将favicon.ico更改为favicon.png,它将显示在网络日志中。但是,favicon.ico似乎是在原始请求中提供的,并且由于某种原因而被缓存。
-
我刚遇到这个问题:stackoverflow.com/a/22659172/961018
-
这不是Spring。如果做任何事情,Spring都会记录。该请求不是由浏览器发送的。
-
您正在使用什么浏览器?我认为它只是忽略了该请求。它可能已记录在特定位置的特定浏览器中。
-
@SotiriosDelimanolis我尝试了几个浏览器,然后尝试了另一个浏览器,并且确实进行了切换。我在chrome和firefox上禁用了缓存,但这并不能解决问题。然后,我在chrome CTRL SHIFT DELETE上清除了缓存。那也没有解决问题,但后来我尝试再次做,然后重新启动浏览器,瞧瞧它起作用了。似乎很难恢复该网站图标!但现在可以了。似乎是浏览器缓存问题,它拒绝刷新。
-
谢谢你的帮助 :)
-
这不是解决方案,如果您认为自己已经摆脱了favicon 404,那么请保持开发人员控制台处于打开状态,并且再次得知您将获得favicon 404也不会感到失望。
-
@hagrawal不是404。浏览器根本没有发出请求。
-
@SotiriosDelimanolis如果浏览器未发出此请求,那么谁在发出此请求?让我们谈谈没有代码来获取网站图标时的默认情况。那为什么要404呢?据我所知-如果浏览器支持Favicon,它将尝试加载favicon并在站点名称旁边显示图标。
-
@ha没有人提出请求。没有发送请求。
-
@SotiriosDelimanolis不是来自代码,但是如果支持favicon,浏览器会发出此请求,我已经提到了这一点。您可以检查-它将以404结尾并且是GET请求。如果浏览器和代码未发出此请求,那么谁在发出请求?
-
@momo您能否说明您是否正在获取404,并且这是来自浏览器的GET请求?
-
@hagrawal就是这个问题。没有任何发送请求。 OP的第一则评论:我在浏览器网络中看不到任何提示favicon.ico的信息
-
@SotiriosDelimanolis好的。但是我们不能忽略他的第一个类似" *我曾经获得favicon.ico找不到的映射,所以决定处理它。* "。按照我的看法,如果支持favicon,浏览器将发出此请求。.在我的答案编辑中添加了一个图像,以我的应用程序示例重新创建它(请注意,我在JS / HTML中没有代码来加载favicon)
-
@hagrawal您完全误解了这个问题。步骤1.我没有工作。第2步。他们通过添加处理程序使其工作。步骤3.他们在HTML标头中添加了link标签。步骤4.不再需要favicon。步骤5.他们问了这个问题,为什么不再要求它了。
-
我确信我们中的任何一个人都会误解这个问题,但是不能说谁!!! OP知道他不是在请求favicon,并猜想它可能是浏览器-"尽管我自己不在html文件中请求favicon.ico,但我想浏览器会自动执行此操作"。不再出错,而是当他尝试使用HTML时。答案很简单,就像我说的那样-" favicon是一个应用程序资源,而不是可以通过映射从服务器获取的数据"。
-
您不能使用<link href=并期望它可以通过Spring映射工作。 href表示HTTP文档参考,可以从Web应用程序结构中查找。
-
@hagrawal我在问题中提到我就是这样做的。结论是浏览器正在缓存它,并且拒绝刷新。那是正确的答案。
-
@momo "您能说明您是否正在获取404,并且这是来自浏览器的GET请求吗?"
-
您的问题是Spring @RequestMapping(a /?/ favicon.icoa€?)在从index.html请求时不起作用。根据我的正确答案是,favicon不是可以通过映射从服务器获取的数据,它是资源..当您从HTML使用它时,它将作为资源获取,并且您的映射将永远不会被调用,而当您从浏览器地址栏进行操作时,它会被Spring拦截并被调用,而这一切都无关使用缓存..尝试从浏览器地址栏命中,映射将总是被调用,但HTML不会。
-
我已经说了一遍又一遍,最后一次/favicon.ico不是服务器对数据的调用,而是服务器对资源的调用,在这种情况下,它是图标或图像..尽力而为据我所知是100%正确..
-
@hagrawal您有客户端,也有服务器。它们之间有outlets(和电线)。客户端发出请求。服务器发送响应。在HTTP中,客户端通过套接字将HTTP请求发送到URL。服务器接收HTTP请求并以HTTP响应进行回复。您所说的数据和资源几乎是毫无意义的。服务器只是通过网络发送字节。在这种情况下,由于某些缓存问题,浏览器(客户端)永远不会发出HTTP请求。
-
@hagrawal认为服务器是一个黑匣子。您看不到它是如何实现的。您所知道的是它发送HTTP响应。
-
@SotiriosDelimanolis我同意您上面所说的,计算机只能理解0和1,因此一切都没有意义。我一直在问一个简单的问题-您可以通过Spring映射解决他的网站图标问题吗(在站点名称旁边应显示结尾图标)?如果我是正确的,那么你们俩(两个)都比我有经验,我对此表示敬意。话虽如此,OP的方法本身是错误的,他试图通过使用映射来解决favicon问题,而任何不能纠正该问题的答案都是错误的答案。我一直在尝试纠正他的方法
-
@hagrawal是的,您可以像创建其他路径一样,创建一个处理程序方法来处理对/favicon.ico的请求。他的问题不在于处理程序方法。
-
@SotiriosDelimanolis然后,您将如何在站点名称旁边显示网站图标,以及网站图标解决的所有目的?
-
@hagrawal显示图像的操作是客户的责任。客户端(浏览器)向服务器发出HTTP请求,服务器以包含二进制文件(应解释为image/x-icon内容)的HTTP响应进行响应。客户端接收该内容,然后以某种方式呈现它。此过程与在此注释正下方显示Add Comment按钮的过程相同。完全不涉及服务器。
-
@SotiriosDelimanolis但是,如果有人使用Favicon或任何应用程序资源,则他有责任在页面上呈现它,而不仅仅是从服务器获取。在未完成端到端解决方案之前,问题不会得到解决。我要重申-OP的解决图标问题本身的方法是错误的,他试图通过使用Spring映射来解决图标问题,而任何无法纠正的答案都是错误的答案。我一直在尝试纠正他的方法
-
@hagrawal尚无百万种说法。即使他们按照您的建议做了,并通过其他某种机制提供了图像内容,他们仍然会遇到同样的问题。问题不是他们如何提供服务,而是浏览器缓存。
-
@hagrawal如果您认为在页面上呈现Web堆栈是他的责任,那么您会对Web堆栈产生严重的误解。这不是网络的工作方式(本例中为浏览器)。
-
@SotiriosDelimanolis他们肯定在正确实施该方法时犯了一些错误。没有100万种方式来实现Favicon,它非常简单直接,我已经在我们的Web应用程序中实现了,还有数百万其他人使用相同的成功方法实现了。
-
@SotiriosDelimanolis我可以接受并改写它,我的意思是它的开发人员责任是确保他实现了他所尝试的..如果他正在尝试使用Favicon,则只需从服务器获取或定义服务器映射即可。还不够,直到站点名称旁边的图标显示未完成等,他的工作还没有完成..
-
@hagrawal在此之后我将停止,因为您似乎不明白我在说什么。 Favicon的概念是一个约定。从您链接到的Wikipedia文章:提供图标支持的浏览器通常在浏览器的地址栏中显示页面的图标。[...]浏览器有责任显示它。服务器(您的Web应用程序)所需要的全部是它对HTTP请求的HTTP响应中获得的字节数。服务器如何获取这些字节与浏览器无关。
-
@ha OP已经声明其处理程序方法可以正常工作并正确提供字节。他们的问题是浏览器(多数情况是无法控制的),而不是服务器。
我遇到了同样的问题。
启动弹簧启动时,您可以在控制台中看到以下内容:
1
| [...] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] |
您可以从application.properties中禁用spring mvc favicon处理程序:
1
| spring.mvc.favicon.enabled=false |
来源:Spring Boot:覆盖favicon