我们还可以研究一下 @CrossOrigin放在类上和方法上都存在时 采用的合并策略和上面的配置类类似:
如果我们直接写 @CrossOrigin 不配置属性,里面有那些属性和默认值
先通过源码看看该注解支持的属性
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
String[] DEFAULT_ORIGINS = { “*” };
String[] DEFAULT_ALLOWED_HEADERS = { “*” };
boolean DEFAULT_ALLOW_CREDENTIALS = true;
long DEFAULT_MAX_AGE = 1800;
/**
- 同origins属性一样
*/
@AliasFor(“origins”)
String[] value() default {};
/**
-
所有支持域的集合,例如"http://domain1.com"。
-
这些值都显示在请求头中的Access-Control-Allow-Origin
-
"*"代表所有域的请求都支持
-
如果没有定义,所有请求的域都支持
-
@see #value
*/
@AliasFor(“value”)
String[] origins() default {};
/**
- 允许请求头中的header,默认都支持
*/
String[] allowedHeaders() default {};
/**
- 响应头中允许访问的header,默认为空
*/
String[] exposedHeaders() default {};
/**
-
请求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。
-
默认支持RequestMapping中设置的方法
*/
RequestMethod[] methods() default {};
/**
- 是否允许cookie随请求发送,使用时必须指定具体的域
*/
String allowCredentials() default “”;
/**
- 预请求的结果的保存有效期,默认30分钟
*/
long maxAge() default -1;
}
源码部分截图:
如果你对这些属性还是不太理解 推荐阅读:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
我们基于百度首页做测试:
准备后端代码 并启动服务:
@RestController
public class TestController {
// 只允许origin是 https://www.baidu.com 的跨域请求
@CrossOrigin(origins = “https://www.baidu.com”)
@GetMapping(“/testCrossOrigin”)
public String testCrossOrigin(){
return “CORS TEST !”;
}
}
打开浏览器测试:
https://www.baidu.com/ 点击后F12 打开console控制台:输入
var xhr = new XMLHttpRequest(); xhr.open(“GET”,“http:localhost:8080/testCrossOrigin”,true); xhr.send();
就是在百度首页下 发起Ajax请求:
后端只有 http://localhost:8080/testCrossOrigin请求配置跨域注解,其他跨域请求都会报错,
下图展示了正确配置 http://localhost:8080/testCrossOrigin的请求结果正常:
这里我们对正常的跨域请求 主要关注请求头和响应头的 Origin 、Access-Control-Allow-Origin 属性特点:属性值相同。
我们不基于百度首页进行测试 发现报错:说明我们的配置只能针对百度首页有效。
总结 :
客户端发起跨域请求CORS 时在请求头设置Origin属性,springmvc接收请求后会根据跨域配置注解的属性判断
是否允许访问以及访问路径模式是否正确**,通过后就会在响应头内设置Access-Control-Allow-Origin 的值取值orgin的值。标识可以正常访问**
拓展:实战问题
spring注解@CrossOrigin不起作用的原因
1、是springMVC的版本要在4.2或以上版本才支持@CrossOrigin
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
…(img-PbAXWeZh-1711085947366)]
总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
[外链图片转存中…(img-FS65oK8m-1711085947367)]