CORS 跨域资源共享——Sringboot服务端的跨域解决方案

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)  //origin:允许请求的域,maxAge: 本次请求的有效期,单位秒;其余参数查阅API或源码可得
        @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 {

            /**
             * @param CorsRegistry - 是用于注册Cros协议内容的一个注册器。
             */
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")          //所有当前站点的请求地址都支持跨域请求,这里也可以指定特定的请求地址允许跨域请求
                        .allowedOrigins("*")        //允许所有外部域进行跨域请求
                        .allowedHeaders("*")        //设置跨域请求头,这里*允许所有头类型进行跨域请求
                        .allowedMethods("*")        //当前站点支持的跨域请求类型,如PUT/GET/POST等等,这里设置所有请求类型
                        .maxAge(3600);              //跨域请求有效期,超时时长设定,单位为秒,这里设置有限期为1个小时
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值