马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在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企服之家,中国第一个企服评测及商务社交产业平台。 |