在讨论
WebMvcConfigurer
接口的每个方法时,我们将通过具体的案例来展示如何实现它们,并分析这些配置对spring mvc应用程序的影响。1. addinterceptors(interceptorregistry registry)
此方法用于注册拦截器,以便在请求处理的不同阶段执行特定操作。
案例: 假设我们需要一个日志拦截器来记录进入控制器的所有请求。
@configuration
public class webconfig implements webmvcconfigurer {
@override
public void addinterceptors(interceptorregistry registry) {
registry.addinterceptor(new logginginterceptor());
}
}
class logginginterceptor implements handlerinterceptor {
@override
public boolean prehandle(httprequest request, httpresponse response, object handler) throws exception {
system.out.println("request url: " + request.getrequesturl());
return true;
}
}
在这个例子中,我们创建了一个名为logginginterceptor
的拦截器,它会在每个请求被处理之前打印出请求的url。然后,我们在addinterceptors
方法中注册了这个拦截器。
2. addviewcontrollers(viewcontrollerregistry registry)
此方法允许你添加简单的控制器,直接将请求映射到视图,而无需完整的控制器逻辑。
案例: 如果我们想为“/error”路径添加一个简单的视图控制器,显示一个错误页面。
@configuration
public class webconfig implements webmvcconfigurer {
@override
public void addviewcontrollers(viewcontrollerregistry registry) {
registry.addcontroller("/error").setviewname("errorpage");
}
}
在此配置中,任何指向“/error”的请求都会被直接转发到名为“errorpage”的视图,无需通过控制器逻辑。
3. addresourcehandlers(resourcehandlerregistry registry)
此方法用于配置静态资源的处理,如css、js文件等。
案例: 配置资源处理器以服务于“/static”路径下的静态资源。
@configuration
public class webconfig implements webmvcconfigurer {
@override
public void addresourcehandlers(resourcehandlerregistry registry) {
registry.addresourcehandler("/static/**")
.addresourcelocations("classpath:/static/");
}
}
这个配置告诉spring mvc,任何以“/static/”开头的请求都应该从类路径下的“/static”目录中提供资源。
4. configuredefaultservlethandling(defaultservlethandlerconfigurer configurer)
此方法用于配置默认的servlet处理,通常用于将请求委托给tomcat或其他servlet容器。
案例: 启用默认的servlet处理,并将“/”路径映射到默认的servlet。
@configuration
public class webconfig implements webmvcconfigurer {
@override
public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer) {
configurer.enable();
}
}
通过调用configuredefaultservlethandling
的enable()
方法,我们可以启用默认的servlet处理,这对于部署在servlet容器中的spring mvc应用程序非常有用。
5. configureviewresolvers(viewresolverregistry registry)
此方法用于配置如何解析视图名称到实际的视图对象。
案例: 配置一个内部资源视图解析器,用于解析tiles布局。
@configuration
public class webconfig implements webmvcconfigurer {
@bean
public tilesviewresolver tilesviewresolver() {
tilesviewresolver resolver = new tilesviewresolver();
resolver.setviewclass(tilesview.class);
return resolver;
}
@override
public void configureviewresolvers(viewresolverregistry registry) {
registry.viewresolver(tilesviewresolver());
}
}
在这个例子中,我们配置了一个tilesviewresolver
,它将视图名称解析为tiles定义的视图。这需要在视图解析器注册表中进行注册。
6. configurecontentnegotiation(contentnegotiationconfigurer configurer)
此方法用于配置内容协商策略,决定客户端和服务器之间通信的最佳格式。
案例: 设置基于请求头的响应格式优先级。
@configuration
public class webconfig implements webmvcconfigurer {
@override
public void configurecontentnegotiation(contentnegotiationconfigurer configurer) {
configurer.favorparameter(true)
.favorpathextension(false)
.favorpathextension(true)
.ignoreacceptheader(false)
.usejaxesormax(false);
.defaultcontenttype(mediatype.texthtml);
}
}
这里我们设置了内容协商的几个参数,优先使用请求参数来决定响应格式,忽略请求头中的accept
字段,默认内容类型设置为text/html
。
7. addcorsmappings(corsregistry registry)
此方法用于配置跨源资源共享(cors),允许不同源的客户端访问你的api。
案例: 允许所有源在任何端口上访问api。
@configuration
public class webconfig implements webmvcconfigurer {
@override
public void addcorsmappings(corsregistry registry) {
registry.addmapping("/**")
.allowedorigins("*")
.allowedmethods("*")
.allowedheaders("*")
.allowcredentials(true)
.maxage(3600);
}
}
在这个配置中,我们添加了一个cors映射,允许来自任何源的请求访问我们的api,支持所有http方法、头部信息和cookies,并且这个规则将在客户端缓存3600秒。