qidao123.com技术社区-IT企服评测·应用市场
标题:
Spring MVC中跨域问题处理
[打印本页]
作者:
一给
时间:
2025-5-8 11:13
标题:
Spring MVC中跨域问题处理
在Spring MVC中处理跨域问题可以通过以下几种方式实现,确保前后端能够正常通讯:
方法一:使用 @CrossOrigin 注解
实用于局部控制跨域配置,直接在Controller或方法上添加注解。
示例代码:
@RestController
@CrossOrigin(origins = "http://localhost:8080") // 允许指定源
public class MyController {
@GetMapping("/data")
public String getData() {
return "Hello, CORS!";
}
}
复制代码
参数说明
:
origins: 允许的源(多个用逗号分隔,或用 @CrossOrigin(origins = "*") 允许全部,但不保举生产情况)。
methods: 允许的HTTP方法(如 RequestMethod.GET)。
allowedHeaders: 允许的哀求头。
allowCredentials: 是否允许发送Cookie(需与前端配置同等)。
方法二:全局配置 WebMvcConfigurer
实用于全局跨域设置,同一管理全部接口的跨域规则。
步骤:
创建配置类实现 WebMvcConfigurer。
重写 addCorsMappings 方法。
示例代码:
@Configuration
public class CorsGlobalConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 匹配所有路径
.allowedOrigins("http://localhost:8080", "https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600); // 预检请求缓存时间(秒)
}
}
复制代码
方法三:使用 CorsFilter
通过自定义过滤器精致化控制跨域行为,得当复杂场景。
示例代码:
@Configuration
public class CorsFilterConfig {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://localhost:8080");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config); // 对所有路径生效
return new CorsFilter(source);
}
}
复制代码
方法四:结合 Spring Security
若项目集成了Spring Security,需额外配置安全规则以启用CORS。
步骤:
在安全配置类中启用CORS。
定义 CorsConfigurationSource Bean。
示例代码:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and() // 启用CORS
.csrf().disable()
.authorizeRequests()
.anyRequest().authenticated();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(Arrays.asList("http://localhost:8080"));
config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
}
复制代码
方法五:通过 <mvc:cors> 命名空间配置全局跨域规则
在 Spring MVC 中,假如项目使用 applicationContext.xml 举行配置(基于 XML 的配置方式),这是最直接的 XML 配置方式,实用于全局跨域设置。
步骤:
确保 XML 文件头部声明白 mvc 命名空间
:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
复制代码
在 <mvc:annotation-driven> 标签内配置跨域规则
:
<mvc:annotation-driven>
<mvc:cors>
<!-- 配置全局跨域 -->
<mvc:mapping path="/**"
allowed-origins="http://localhost:8080, https://example.com"
allowed-methods="GET, POST, PUT, DELETE, OPTIONS"
allowed-headers="Content-Type, Authorization"
allow-credentials="true"
max-age="3600"/>
</mvc:cors>
</mvc:annotation-driven>
复制代码
参数说明
:
path: 匹配的 URL 路径模式(支持 Ant 风格,如 /api/**)。
allowed-origins: 允许的源(多个用逗号分隔)。
allowed-methods: 允许的 HTTP 方法。
allowed-headers: 允许的哀求头。
allow-credentials: 是否允许发送 Cookie(对应 allowCredentials(true))。
max-age: 预检哀求缓存时间(秒)。
方法六:通过自定义 CorsFilter Bean 配置
通过applicationContext.xml配置处理跨域问题时,假如需要对跨域行为举行更细粒度的控制(比方动态配置),可以手动注册 CorsFilter。
步骤:
在 applicationContext.xml 中定义 CorsFilter Bean
:
<bean id="corsFilter" class="org.springframework.web.filter.CorsFilter">
<constructor-arg>
<bean class="org.springframework.web.cors.UrlBasedCorsConfigurationSource">
<property name="corsConfigurations">
<map>
<entry key="/**">
<bean class="org.springframework.web.cors.CorsConfiguration">
<property name="allowedOrigins">
<list>
<value>http://localhost:8080</value>
<value>https://example.com</value>
</list>
</property>
<property name="allowedMethods">
<list>
<value>GET</value>
<value>POST</value>
<value>PUT</value>
<value>DELETE</value>
<value>OPTIONS</value>
</list>
</property>
<property name="allowedHeaders">
<list>
<value>Content-Type</value>
<value>Authorization</value>
</list>
</property>
<property name="allowCredentials" value="true"/>
<property name="maxAge" value="3600"/>
</bean>
</entry>
</map>
</property>
</bean>
</constructor-arg>
</bean>
复制代码
确保 CorsFilter 优先实行
:
在 web.xml 中,将 CorsFilter 注册为第一个 Filter:
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
复制代码
完备示例:结合 applicationContext.xml 和 web.xml
applicationContext.xml 配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 启用注解驱动并配置 CORS -->
<mvc:annotation-driven>
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="http://localhost:8080"
allowed-methods="GET, POST, PUT, DELETE"
allowed-headers="Content-Type, Authorization"
allow-credentials="true"
max-age="3600"/>
</mvc:cors>
</mvc:annotation-driven>
</beans>
复制代码
web.xml 配置(确保 Filter 顺序):
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.springframework.web.filter.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
复制代码
通过方式五和方式六,可以在基于 XML 的 Spring MVC 项目中机动配置跨域规则。保举使用 <mvc:cors> 命名空间配置,简朴且直接;若需动态控制,则选择 CorsFilter。
关键注意事项
预检哀求(Preflight)
:欣赏器会先发送 OPTIONS 哀求检查服务器是否允许跨域。确保配置中包含 allowedMethods 并精确处理 OPTIONS。
携带凭据(Cookies)
:若需传输Cookies,前端需设置 withCredentials: true,后端需设置 allowCredentials(true),且 allowedOrigins 不能为 *。
生产情况安全
:避免使用通配符 *,应明白指定允许的源、方法和头信息。
allowedOrigins vs allowedOriginPatterns
:
假如使用 Spring 5.3+,可以用 allowedOriginPatterns 支持通配符模式(如 http://*.example.com)。
XML 配置中需通过 <list> 手动指定详细域名。
与 Spring Security 集成
:
假如项目集成了 Spring Security,需在安全配置中启用 CORS:
<http auto-config="true" use-expressions="true">
<cors/> <!-- 启用 CORS -->
<!-- 其他安全配置 -->
</http>
复制代码
通过上述方法,可机动解决Spring MVC中的跨域问题,根据项目需求选择最合适的方案。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4