Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式)

这篇具有很好参考价值的文章主要介绍了Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式)

出于安全原因,浏览器禁止AJAX调用当前源之外的资源。

跨域资源共享(CORS)是由大多数浏览器实现的W3C规范,它允许您以一种灵活的方式指定授权哪种跨域请求,而不是使用一些不太安全、功能不太强大的hack(如IFrame或JSONP)。

Spring Framework 4.2 GA为CORS提供了一流的开箱即用支持,为我们提供了一种比典型的基于过滤器的解决方案更简单、更强大的配置方式。

一、注解方式使用

1.方法上添加@CrossOrigin注解
@RestController
@RequestMapping("/account")
public class AccountController {

	@CrossOrigin
	@GetMapping("/{id}")
	public Account retrieve(@PathVariable Long id) {
		// ...
	}

	@DeleteMapping("/{id}")
	public void remove(@PathVariable Long id) {
		// ...
	}
}

使用此种方式只会对当前方法生效。

2.Controller上添加@CrossOrigin注解
@CrossOrigin
@RestController
@RequestMapping("/account")
public class AccountController {

	@GetMapping("/{id}")
	public Account retrieve(@PathVariable Long id) {
		// ...
	}

	@DeleteMapping("/{id}")
	public void remove(@PathVariable Long id) {
		// ...
	}
}

使用此种方式会对整个Controller生效。

3.@CrossOrigin的两个参数使用
  1. origins: 允许可访问的域列表
  2. maxAge:准备响应前的缓存持续的最大时间(以秒为单位)
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

	@GetMapping("/{id}")
	public Account retrieve(@PathVariable Long id) {
		// ...
	}

	@DeleteMapping("/{id}")
	public void remove(@PathVariable Long id) {
		// ...
	}
}

这两个参数也可以分开单独使用,如下所示:

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

	@CrossOrigin(origins = "http://domain2.com")
	@GetMapping("/{id}")
	public Account retrieve(@PathVariable Long id) {
		// ...
	}

	@DeleteMapping("/{id}")
	public void remove(@PathVariable Long id) {
		// ...
	}
}
4.注意事项

如果有正在使用Spring Security,需要在Spring Security中启用CORS,以允许它利用Spring MVC定义的配置。如下所示:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.cors().and()...
	}
}

二、CORS全局配置使用

除了细粒度的、基于注释的配置之外,我们还可以自定义一些全局CORS配置。类似于使用过滤器,但可以在Spring MVC中声明,并结合细粒度的@CrossOrigin配置。默认情况下,所有的origin和GET、HEAD和POST方法都可以使用。

1.Java配置类方式

使用非常简单,如下所示:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**");
	}
}

如果是使用的Spring Boot,建议只声明一个WebMvcConfigurer bean,如下所示:

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

除此之外,我们还可以自定义更多的其他属性,比如将CORS配置应用于特定的路径模式:

@Override
public void addCorsMappings(CorsRegistry registry) {
	registry.addMapping("/api/**")
		.allowedOrigins("http://domain2.com")
		.allowedMethods("PUT", "DELETE")
			.allowedHeaders("header1", "header2", "header3")
		.exposedHeaders("header1", "header2")
		.allowCredentials(false).maxAge(3600);
}

同样,此处我们要注意Spring Security使用的情况,具体实现参考注解使用中的实现。

2.XML配置文件方式

当然,我们也可以使用xml配置文件的方式来进行全局配置,如下所示:

<mvc:cors>
	<mvc:mapping path="/**" />
</mvc:cors>

同样也可以在xml中自定义CORS映射,如下所示:

<mvc:cors>

	<mvc:mapping path="/api/**"
		allowed-origins="http://domain1.com, http://domain2.com"
		allowed-methods="GET, PUT"
		allowed-headers="header1, header2, header3"
		exposed-headers="header1, header2" allow-credentials="false"
		max-age="123" />

	<mvc:mapping path="/resources/**"
		allowed-origins="http://domain1.com" />

</mvc:cors>

如果正在使用Spring Security,同样要在Spring Security启用CORS:

<http>
	<!-- Default to Spring MVC's CORS configuration -->
	<cors />
	...
</http>

三、原理解释

CORS请求(包括带有OPTIONS方法的飞行前请求)被自动分派给已注册的各种HandlerMappings。它们处理CORS预飞行请求,并通过CorsProcessor实现(默认为DefaultCorsProcessor)拦截CORS简单和实际请求,以便添加相关的CORS响应头(如Access-Control-Allow-Origin)。CorsConfiguration允许您指定应该如何处理CORS请求:allowed origins, headers, methods, etc等。

可以通过多种方式提供,如:

  • AbstractHandlerMapping#setCorsConfiguration()允许在路径模式(如/api/)上指定多个CorsConfiguration映射的Map
  • 子类可以通过重写AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法来提供他们自己的CorsConfiguration
  • 处理程序可以实现CorsConfigurationSource接口(就像ResourceHttpRequestHandler现在做的那样),以便为每个请求提供CorsConfiguration。

除此之外,还可以使用基于CORS的过滤器支持,作为上述其他方法的替代方案,Spring Framework还提供了CorsFilter。在这种情况下,不使用@CrossOrigin或WebMvcConfigurer# addcorsmapping (CorsRegistry),我们可以像下面这样在Spring Boot中声明过滤器:

@Configuration
public class MyConfiguration {

	@Bean
	public FilterRegistrationBean corsFilter() {
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		CorsConfiguration config = new CorsConfiguration();
		config.setAllowCredentials(true);
		config.addAllowedOrigin("http://domain1.com");
		config.addAllowedHeader("*");
		config.addAllowedMethod("*");
		source.registerCorsConfiguration("/**", config);
		FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
		bean.setOrder(0);
		return bean;
	}
}

以上内容参考自Spring官方文档:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
同时欢迎各位来我的个人博客:http://bravegougou.cn/文章来源地址https://www.toymoban.com/news/detail-712616.html

到了这里,关于Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 快速解决Spring Boot跨域困扰:使用CORS实现无缝跨域支持

    什么是跨域? 跨域(Cross-Origin Issue)的存在是因为浏览器的安全限制,它防止恶意网站利用跨域请求来获取用户的敏感信息或执行恶意操作。浏览器通过实施同源策略来限制网页在不同源之间进行资源访问或交互的情况。当一个网页的协议、域名、或端口与当前页面的协议、

    2024年02月12日
    浏览(55)
  • Nginx使用“逻辑与”配置origin限制,修复CORS跨域漏洞

    漏洞名称: CORS 跨域 漏洞等级: 中危 漏洞证明: Origin从任何域名都可成功访问,未做任何限制。 漏洞危害: 因为同源策略的存在,不同源的客户端脚本不能访问目标站点的资源,如果目标站点并配置不当,没有对请求源的域做严格限制,导致任意源都可以访问时,就能在

    2023年04月09日
    浏览(53)
  • 本地HTML访问后端获取数据使用@CrossOrigin仍出现跨域问题

    Access-Control-Allow-Credentials 这个头的作用,果然药到病除。这个是服务端下发到客户端的 response 中头部字段,意义是允许客户端携带验证信息,例如 cookie 之类的。这样客户端在发起跨域请求的时候,不就可以携带允许的头,还可以携带验证信息的头,又由于客户端是请求框架

    2024年02月13日
    浏览(49)
  • Spring Boot中解决跨域问题(CORS)

    首先解释什么是跨域,跨域就是前端和后端的端口号不同;会产生跨域问题,这里浏览器的保护机制(同源策略)。 同源策略:前端和后端的协议、域名、端口号三者都相同叫做同源。 我们看一下不同源: VUE:http://localhost:8080 Spring: http://localhost:8081/list 当我们出现跨域问题

    2024年02月06日
    浏览(69)
  • Asp .Net Core 系列: 集成 CORS跨域配置

    CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一

    2024年01月24日
    浏览(88)
  • SpringBoot 配置CORS处理前后端分离跨域配置无效问题解析

    浏览器有跨域限制,非同源策略(协议、主机名或端口不同)被视为跨域请求,解决跨域有跨域资源共享( CORS )、反向代理和 JSONP 的方式。本篇通过 SpringBoot 的资源共享配置(CORS)来解决前后端分离项目的跨域,以及从原理上去解决跨域配置不生效的问题。 使用前后端分离开源项

    2023年04月23日
    浏览(51)
  • 跨域问题(@CrossOrigin和Proxy)

    1️⃣跨域问题 在Web开发中,如果前端页面和后端接口不在同一个域名下,就会发生跨域请求的问题。同源策略是浏览器的一种安全策略,它限制了来自不同源的客户端脚本在浏览器中运行时的交互。同源指的是协议、域名、端口都相同。如果客户端脚本试图通过XMLHttpReques

    2024年02月11日
    浏览(37)
  • 后端通过CorsRegistry对象配置了全局跨域,但是前端仍然报CORS跨域错误

    问题背景 在实现登录功能时,我先是通过CorsRegistry配置了全局跨域,然后配置了一个登录拦截器后前端就报错 CORS 跨域错误 问题原因 前置知识 首先我们来了解一下什么是跨域错误, 跨域错误 (Cross-Origin Error)是在Web开发中常见的错误之一,它发生在浏览器执行跨源请求(

    2024年02月07日
    浏览(53)
  • 解决Spring Boot跨域问题(配置JAVA类)

    跨域问题指的是不同端口之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它是为了保证用户的安全,防止恶意网站窃取数据。 比如前端用的端口号为8081,后端用的端口号为8080,后端想接收前端发送的数据就会出现跨域问题。 如图所示: 这里

    2024年01月17日
    浏览(49)
  • nginx设置add_header失效 配置cors跨域失效无效的解决方案

    希望对大家有帮助,有用的话记得点个赞评个论,让俺知道这个法子可以帮助到大家哟!(虽然我这个法子很野) 最近在完成一个项目,后端API地址和前端地址不一致,这就涉及到了跨域的问题。 由于服务端加了一层Nginx作为反代,所以很自然的想到要去 .conf 配置文件中 加

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包