无法找到mvc:cors定义的Spring 4项目问题求助
解决Spring 4中
<mvc:cors>元素找不到声明的问题 问题根源
<mvc:cors>这个XML配置元素是Spring 4.2及以上版本才新增的,如果你本地项目的Spring MVC版本低于4.2,哪怕xmlns和schemaLocation配置完全正确,也会触发cvc-complex-type.2.4.c报错——因为低版本的spring-mvc.xsd里根本没有定义这个元素。你反编译的war包对应的项目应该是用了Spring 4.2+版本,和你本地的版本不匹配。
解决方案
方案1:升级Spring MVC到4.2+版本
- 检查项目依赖配置(Maven的
pom.xml或Gradle的build.gradle),将spring-webmvc的版本升级到4.2.x及以上,注意要和项目中Spring核心模块的版本保持一致,比如:<!-- Maven示例 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.9.RELEASE</version> </dependency> - 升级后无需修改现有XML的命名空间配置,
http://www.springframework.org/schema/mvc/spring-mvc.xsd会自动对应到新版本的schema定义。
方案2:不升级Spring版本,改用代码配置CORS
如果项目无法升级Spring版本,可以用以下两种替代方式实现相同的CORS规则:
方式一:实现WebMvcConfigurer(Spring 3.2+支持)
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") .allowedHeaders("*") .allowCredentials(false) .maxAge(4800); } }
方式二:自定义CORS Filter(兼容更低版本)
先创建Filter类:
public class CorsFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Max-Age", "4800"); response.setHeader("Access-Control-Allow-Credentials", "false"); // 直接处理OPTIONS请求,避免后续业务逻辑处理 if ("OPTIONS".equals(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); } else { filterChain.doFilter(request, response); } } }
然后在web.xml中配置这个Filter:
<filter> <filter-name>corsFilter</filter-name> <filter-class>你的包路径.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>corsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
内容的提问来源于stack exchange,提问作者Thom
相关产品推荐
相关产品推荐

