1. 客户端:发送ajax/fetch请求;
2. 服务器端:设置相关的头信息(需要处理OPTIONS试探性请求)fetch请求;
服务端可设置的跨域头信息一半包含以下几个:
a. Access-Control-Allow-Origin: 服务端为该信息设置值,表示允许哪些不同域对本服务进行请求;
b. Access-Control-Allow-Credentials: 服务端为该信息设置值,表示服务端允许的域请求是否可以携带Cookie或Session等信息,true表示允许,false表示禁止;
c. Access-Control-Allow-Header: 服务端允许的请求头信息,一般为“Content-Type,Content-Length,Authorization,Accept,X-Requested-With"等;
d. Accept-Control-Allow-Methods: 服务端设定端口允许跨域请求的方式:PUT,GET,POST,DELETE,OPTIONS,HEAD;
3. JavaWeb项目设置端口跨域请求
a. 给指定的某个或某几个端口设置跨域请求:
在该接口方法下添加response响应头信息:
response. setHeader ( "Access-Control-Allow-Origin" , "*" ) ;
response. setHeader ( "Accept-Control-Allow-Methods" , "*" ) ;
response. setHeader ( "Access-Control-Allow-Header" , "" ) ;
b. SpringBoot 项目可通过注解@CrossOrigin解决:
(1) @CrossOrigin使用场景要求:
jdk1.8+
Spring4.2+
(2) @CrossOrigin使用1 ———— 局部单个接口使用
在指定接口所在的Controller类中找到对应的功能方法,在方法上加上@CrossOrigin注解,并设置参数,如:
@CrossOrigin ( origins = "*" , maxAge = 3600 )
@GetMaaping ( "/userList" )
public List< User> userList ( HttpServletRequest req, HttpServletResponse resp) {
}
(3) @CrossOrigin使用2 ———— 单个Controller类使用(优点:避免该类下每个接口的单独设置,类名上统一设置,类中的所有接口都适用)
找到要设置跨域请求的Controller,在类名前添加@CrossOrigin注解即可,如:
@RestController
@CrossOrigin ( origins = "*" , maxAge = 3600 )
public class UserController {
@GetMaaping ( "/userList" )
public List< User> userList ( HttpServletRequest req, HttpServletResponse resp) {
}
}
(4) @CrossOrigin使用3 ———— SpringBoot项目全局使用
项目中新建全局配置类,通过实现WebMvcConfigurer接口时,重写方法addCorsMappings,addCorsMappings方法是用于增加Cros协议配置的方法。默认的实现是空实现。也就是说,在默认的配置环境中,是不进行Cros协议的配置的。如:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings ( CorsRegistry registry) {
registry. addMapping ( "/**" )
. allowedOrigins ( "*" ) / / 允许所有外部域进行跨域请求
. allowedHeaders ( "*" ) / / 设置跨域请求头,这里* 允许所有头类型进行跨域请求
. allowedMethods ( "*" ) / / 当前站点支持的跨域请求类型,如PUT/ GET/ POST等等,这里设置所有请求类型
. maxAge ( 3600 ) ; / / 跨域请求有效期,超时时长设定,单位为秒,这里设置有限期为1 个小时
}
}