Skip to content
标签
跨域
字数
492 字
阅读时间
3 分钟

一、概述

二、前端实现

2.1 Jsonp

  • ajax 不能进行跨域请求(如果 ajax 请求的控制器返回的就是字 符串六或 json 数据,不能访问)
  • 发现可以在一个项目直接访问另一个项目的 js 文件.(标签引 用还是通过 ajax 访问)
  • 使用 ajax 访问另一个项目的控制器,但是控制器返回的结果伪 装成 js 文件.

使用 jsonp 时服务器端返回的数据格式:函数名(返回的数据);

代码

javascript
$(function(){ 
    $("button").click(function(){
        $.ajax({ 
            url:'http://localhost:9002/demo2', 
            type:'post', 
            // dataType: 一定要设置 jsonp 
            dataType:'jsonp', 
            // jsonCallback: 参数名对应的值,表示最终回调的函数名.省略的默认值 jquery:一堆数字 
            // 如果单独编写了一个 function,必须要求 jsonpCallback 和 function 的名称相同 
            jsonpCallback:'ab12312321c',
            // jsonp: 传递给服务器的参数名.省略的默认 callback 
            jsonp:'callback', 
            // 如果直接使用 success:function()对 jsonpCallback 值没有要求. 
            success:function(data){ 
                alert(data+"success"); 
            } 
        }); 
    }) 
})
java
// 服务端
//使用 spring 对 jackson 封装类 MappingJacksonValue
@ResponseBody 
public MappingJacksonValue demo(String callback){ 
    People p = new People(); 
    p.setId(1); 
    p.setName("张三");
    //把构造方法参数转换为 json 字符串并当作最终返回值函数的参数
    MappingJacksonValue mjv = new MappingJacksonValue(p); 
    //最终返回结果中函数名 mjv.setJsonpFunction(callback); 
    return mjv; 
}

二、后端实现

2.1 添加跨域配置

java
/**
* 跨域配置
* 只要是带自定义header的跨域请求,在发送真实请求前都会先发送OPTIONS请求,浏览器根据OPTIONS请求返回的结果来决定是否继续发送真实的请求进行跨域资源访问。
*/
@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    // 设置访问源地址
    config.addAllowedOrigin("*");
    // 设置访问源请求头
    config.addAllowedHeader("*");
    // 设置访问源请求方法
    config.addAllowedMethod("*");
    // 对接口配置跨域设置
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}