Favicon是与您的网站相关的图标(favicon.ico)。 并非每个网站都在使用favicon。 但是大多数浏览器并不关心它,反正他们都要求它。 当图标图标不在适当位置时,服务器将返回不必要的404 Not Found
错误。
在典型的Spring MVC应用程序中,我们首先需要配置安全过滤器,该过滤器允许所有对favicon.ico的请求,因为Spring Security会缓存用户的请求,包括favicon.ico请求。 成功通过身份验证后,Spring Security会将我们重定向到显示错误的资源。 为了避免这种情况,我们通过以下方式配置安全过滤器:
<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/**
路径:
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {private static final String RESOURCES_HANDLER = "/resources/";private static final String RESOURCES_LOCATION = RESOURCES_HANDLER + "**";@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(RESOURCES_HANDLER).addResourceLocations(RESOURCES_LOCATION);}}
可以将favicon.ico文件添加到resource/images
目录,但是随后应创建其他@Controller
以将任何favicon.ico请求转发到实际图标。 我正在使用配置中的静态类来执行此操作:
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {@Controllerstatic class FaviconController {@RequestMapping("favicon.ico")String favicon() {return "forward:/resources/images/favicon.ico";}}}
怎么运行的? 当客户端请求localhost:8080/favicon.ico
,控制器会将请求转发到静态资源。 将来,当您需要为网站提供favicon.ico时,只需替换resources/images
目录中的文件即可。
我最近想到的另一种方法是,添加一个@Controller
,它具有一个返回空@ResponseBody
方法:
@Controller
class FaviconController {@RequestMapping("favicon.ico")@ResponseBodyvoid favicon() {}
}
它将解决404 Not Found
问题,但将来您将需要记住进行配置更改,以防您需要为网站添加favicon.ico。
- 可以在GitHub上的Spring MVC快速入门原型中找到该配置。
翻译自: https://www.javacodegeeks.com/2014/02/configure-favicon-ico-in-spring-mvc-based-application.html