目录
一、处理跨域请求
1、跨域描述
说明:严格的说,浏览器并不是拒绝所有的跨域请求,实际上拒绝的是跨域的读操作
① 通常浏览器允许进行跨域写操作(Cross-origin writes),如链接,重定向;
② 通常浏览器允许跨域资源嵌入(Cross-origin embedding),如 img、script 标签;
③ 通常浏览器不允许跨域读操作(Cross-origin reads)。*Q:什么情况才算作跨域?
A:非同源请求,均为跨域。名词解释:同源 —— 如果两个页面拥有相同的协议(protocol),端口(port)和主机(host),那么这两个页面就属于同一个源(origin)。Q:为什么有跨域需求?
A:场景 —— 工程服务化后,不同职责的服务分散在不同的工程中,往往这些工程的域名是不同的,但一个需求可能需要对应到多个服务,这时便需要调用不同服务的接口,因此会出现跨域。
2、引入pom.xml
说明:前面章节这些包已经引用过
<!-- 启动控制,web项目必须引入的 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring用于支持HTML,静态等文件和页面展示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
3、配置hosts文件
在windows环境测试下,编辑C:\Windows\System32\drivers\etc目录下的hosts文件,如下图
域名可按照自己设定的写
4、测试代码
在org.springboot.springboot01.controller包下,创建CrossOriginController类
package org.springboot.springboot01.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class CrossOriginController {
private static final Logger log = LoggerFactory.getLogger(CrossOriginController.class);
@RequestMapping("index")
public String index () {
log.debug("进入index方法");
return "index_hello";
}
@RequestMapping("forbidCross")
@ResponseBody
public String forbidCross(){
return "禁止跨域";
}
@RequestMapping("allowCross")
@ResponseBody
@CrossOrigin(value = "*") // *表示所有域都支持
public String allowCross(){
return "允许跨域";
}
}
在resources/templates下,新增index_hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>跨域测试</title>
<script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
</head>
<body>
<div id="hello"></div>
</body>
<script>
$(function () {
// http://www.test.com:8080/springboot/forbidCross
$.get("http://www.test.com:8080/springboot/allowCross", function (data) {
$("#hello").text(data);
})
})
</script>
</html>
① 当html中使用的是:http://www.test.com:8080/springboot/forbidCross地址,对应的是不支持跨域的,就无法显示其内容。
② 当html中使用的是:http://www.test.com:8080/springboot/allowCross地址,对应的是可支持跨域的,会显示其内容。
5、@
CrossOrigin注解说明
属性 | 含义 |
---|---|
value | 指定所支持域的集合,* 表示所有域都支持,默认值为* 。这些值对应HTTP请求头中的Access-Control-Allow-Origin |
origins | 同value |
allowedHeaders | 允许请求头中的header,默认都支持 |
exposedHeaders | 响应头中允许访问的header,默认为空 |
methods | 支持请求的方法,比如GET ,POST ,PUT 等,默认和Controller中的方法上标注的一致。 |
allowCredentials | 是否允许cookie随请求发送,使用时必须指定具体的域 |
maxAge | 预请求的结果的有效期,默认30分钟 |