您当前的位置: 首页 >  spring

梁云亮

暂无认证

  • 3浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【精品】SpringBoot跨域请求 解决方案汇总

梁云亮 发布时间:2020-05-02 03:36:33 ,浏览量:3

代码下载地址:本博客示例代码

第一步:创建前端页面 项目结构图

在这里插入图片描述

页面代码
DOCTYPE html>


    添加部门
    
    
        $(function () {
            $.ajax({
                url: "http://localhost/ky/fun",  //假设服务器端请求的url
                data: {p: "helloworld"},
                dataType: "json",
                success: function (res) {
                    res = JSON.stringify(res);
                    console.log(res);
                    $("#show").text(res);
                }
            });
        });
    





第二步:创建SpringBoot项目 添加Maven依赖

    org.springframework.boot
    spring-boot-starter-web

Controller代码
@RestController
public class DemoController {
    @RequestMapping("/fun")
    public String fun(String p){
        System.out.println("param "+p);
        return "{\"name\":\"zhangsan\"}";
    }
}
第三步:具体实现跨域的方法 方法一:重写WebMvcConfigurer(全局跨域)
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //添加映射路径
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //设置放行哪些原始域
                .allowedOriginPatterns("*")
                //放行哪些请求方式
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                //.allowedMethods("*") //或者放行全部
                //放行哪些原始请求头部信息
                .allowedHeaders("*")
                //暴露哪些原始请求头部信息
                .exposedHeaders("*")
                .maxAge(3600);
    }
}

说明:

  • addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
  • allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:“http://www.baidu.com”,只有百度可以访问我们的跨域资源。
  • allowCredentials: 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以
  • allowedMethods:允许输入参数的请求方法访问该跨域资源服务器,如:POST、GET、PUT、OPTIONS、DELETE等。
  • allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:“X-YAUTH-TOKEN”
  • maxAge:配置客户端缓存预检请求的响应的时间(以秒为单位)。默认设置为1800秒(30分钟)。

下面代码也可以写成如下形式:

public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            // 重写父类提供的跨域请求处理的接口
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                // 添加映射路径
                registry.addMapping("/**")
                        // 放行哪些原始域
                        .allowedOriginPatterns("*")
                        // 是否发送Cookie信息
                        .allowCredentials(true)
                        // 放行哪些原始域(请求方式)
                        .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")
                        // 放行哪些原始域(头部信息)
                        .allowedHeaders("*")
                        // 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
                        .exposedHeaders("Header1", "Header2")
                        // 预请求的结果有效期,默认1800分钟,3600是一小时
                        .maxAge(3600);
            }
        };
    }

}
方法二:自定义Filter解析跨域(全局跨域)
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@SpringBootConfiguration
public class WebGlobalConfig {
    @Bean
    public CorsFilter corsFilter() {
        //创建CorsConfiguration对象后添加配置
        CorsConfiguration config = new CorsConfiguration();
        //设置放行哪些原始域
        //config.addAllowedOrigin("*");  // 旧版本
        config.addAllowedOriginPattern("*");   //新版本
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //放行哪些请求方式
        config.addAllowedMethod("GET");     //get
        config.addAllowedMethod("PUT");     //put
        config.addAllowedMethod("POST");    //post
        config.addAllowedMethod("DELETE");  //delete
        //corsConfig.addAllowedMethod("*");     //放行全部请求

        //是否发送Cookie
        config.setAllowCredentials(true);

        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource =
                new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**", config);
        //返回CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}

在SpringBoot2.4.4之后,当allowCredentials为true时,alloedOrigins不能包含特殊值“*”,因为该值不能在“Access-Control-Allow-Origin”响应头部中设置。要允许凭据访问一组来源,请显式列出它们或考虑改用“AllowedOriginPatterns”。

上面自定义Filter解析跨域的代码也可以写成如下形式:

@WebFilter
@Configuration
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin","*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
//        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
        chain.doFilter(req, res);
    }
}
方法三:@CrossOrigin注解(局部跨域)

在Controller类或者处理用户请求的方法上加@CrossOrigin注解。 假设前端请求页面的网址为:http://localhost:63342/kuayu/frontend/demo.html,则:

@CrossOrigin(origins = "http://localhost:63342", maxAge = 3600)
@RestController
public class DemoController {
    @RequestMapping("/fun")
    public String fun(String p){
        System.out.println("param "+p);
        return "{\"name\":\"zhangsan\"}";
    }
}
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0422s