跨域请求

跨域请求

跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为如果协议 + 域名 + 端口号均相同,那么就是同域,否则则是跨域的

​ 跨域请求是由于浏览器的同源策略导致的,浏览器的同源策略是不能没有的(同源策略是浏览器最核心最基础的安全策略)

  1. 同源策略禁止 Ajax 直接发起跨域HTTP请求(其实可以发送请求,结果被浏览器拦截,不展示),同时 Ajax 请求不能携带与本网站不同源的 Cookie;如果没有同源策略别的域名就可以拿到你浏览器上其他的Cookie信息,这样会导致很多重要的信息泄露,例如不法的网站可能会利用你的cookie去登录一些网站,盗用你的信息等。
  2. DOM 层面的同源策略限制了来自不同源的Document对象或 JS 脚本,对当前document对象的读取或设置某些属性;没有同源策略,一些脚本就能获取到你的用户密码输入框的内容信息

JSONP

​ JSONP 是一种非官方的跨域数据交互协议;JSONP 本质上是利用

JSONP 的理念就是:与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段Javascript,在这段 Javascript 代码中调用了约定好的回调函数,并且将数据作为参数进行传递。当网页接收到这段 Javascript 代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了

​ JSONP**只支持 get请求,只支持 get请求,只支持 get请求**

/**
  * 如果使用了springmvc 3.2以上的版本 和5.0以下的版本可以配置一个jsonp 的 Advice 就可以了
  *   spring会自动做相应的处理
  *
  *  注意:springboot2.0以上舍弃了AbstractJsonpResponseBodyAdvice
  */
@ControllerAdvice
public class JsonPAdvice extends AbstractJsonpResponseBodyAdvice {

    public JsonPAdvice() {
        // 这样如果请求中带 callback 参数,Spring 就知道这个是 jsonp 的请求了
        super("callback");
    }

}
/**
  * JsonP 只支持get方法
  * 需要配置dataType为 jsonp
  */
function getJsonP() {
    $.ajax({
        type:"get",
        url:"http://localhost:8088/getJsonP/value.do",
        dataType:"jsonp",
        success:function (data) {
            $("#userName").val(data.userName);
        },
        error:function () {
            $("#userName").val("错误了");
        }
    });
}

CORS

​ 跨源资源共享 Cross-Origin Resource Sharing(CORS) 是一个新的 W3C 标准,它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求,从而克服 Ajax 只能同源使用的限制

CORS新增的HTTP头信息
  1. Access-Control-Allow-Origin | *

    ​ 响应首部中可以携带这个头部表示服务器允许哪些域可以访问该资源

    ​ origin 参数的值指定了允许访问该资源的外域 URI。对于不需要携带身份凭证的请求,服务器可以指定该字段的值为通配符,表示允许来自所有域的请求

  2. Access-Control-Allow-Methods […, ] | *

    该首部字段用于预检请求的响应,指明实际请求所允许使用的HTTP方法

  3. Access-Control-Allow-Headers […, ] | *

    该首部字段用于预检请求的响应。指明了实际请求中允许携带的首部字段

  4. Access-Control-Allow-Credentials true | false

    表示是否允许发送Cookie

    ​ **注意:**如果需要在 Ajax 中设置和获取 Cookie,那么Access-Control-Allow-Origin首部字段不能设置为* ,必须设置为具体的 origin 源站

Configuration配置方式
/**
 * 如果使用了springmvc4.2以上的版本,直接使用mvc相关配置即可
 * 
 * springboot 2.0 以上的版本中 WebMvcConfigurerAdapter 已经过时了
 *
 *  可以实现 WebMvcConfigurer 来达到相同的目的
 */
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
		//addMapping是指定支持跨域的路径     
      	registry.addMapping("/**")
              //如果前端不带cookie过来或者不限制域访问的话,那么设置 .allowedOrigins("*") 即可
              //.allowedOrigins("*")
              .allowedOrigins("http://localhost:8001", "http://localhost:8002")
              .allowedMethods("GET", "POST", "PUT", "DELETE")
              .allowCredentials(true);
    }
}
/**
 * crossDomain: true,这里代表使用跨域请求
 *
 *  xhrFields: {withCredentials: true}
 *      这样配置就可以把 cookie 带过去了,不然我们连 session 都没法维护
 *      当然,如果你没有这个需求,也就不需要配置这个了
 *
 *    注意:如果配置了true 需要带cookie信息过去的话,后端的Access-Control-Allow-Origin不能配置成 *
 *           需要配置为具体的 origin 源站
 */
function getCors() {
    $.ajax({
        type:"POST",
        url:"http://localhost:8088/getCors/value.do",
        dataType:"json",
        crossDomain: true,
        xhrFields: {
            withCredentials: false
        },
        success:function (data) {
            $("#userName").val(data.userName);
        },
        error:function () {
            $("#userName").val("错误了");
        }
    });
}
CrossOrigin注解方式

除了Configuration的配置方式外,springMVC4.2之后的版本都支持注解的方式,可以使用@CrossOrigin 注解来实现

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
    //默认的Access-Control-Allow-Origin 是 '*'
    @Deprecated
    String[] DEFAULT_ORIGINS = new String[]{"*"};
    //默认的Access-Control-Allow-Headers 是 ‘*’
    @Deprecated
    String[] DEFAULT_ALLOWED_HEADERS = new String[]{"*"};
    //默认的Access-Control-Allow-Credentials 是false;即不允许发送cookie
    @Deprecated
    boolean DEFAULT_ALLOW_CREDENTIALS = false;
    //默认在1800秒内,不需要发出第二次预检请求
    @Deprecated
    long DEFAULT_MAX_AGE = 1800L;

    @AliasFor("origins")
    String[] value() default {};

    @AliasFor("value")
    String[] origins() default {};

    String[] allowedHeaders() default {};

    String[] exposedHeaders() default {};

    RequestMethod[] methods() default {};

    String allowCredentials() default "";

    long maxAge() default -1L;
}
/**
 * CrossOrigin 注解可以作用在整个Controller上或者作用在方法上
 *      作用在类上是:表示支持拦截整个controller的接口
 *      作用在方法上是:表示支持拦截指定的接口
 *
 *      配置中value和origins等价,均为配置Access-Control-Allow-Origin
 */
@CrossOrigin(origins = {"http://localhost:8001", "http://localhost:8002"},
            methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE},
            allowCredentials = "true")
@RestController
@RequestMapping("/getCors")
public class CorsController {

    @RequestMapping(value = "/value.do")
    public CorsUser getCors() {
        return new CorsUser("我是Cors");
    }

}
HttpServletResponse方式
@RestController
@RequestMapping("/getCors")
public class CorsController {

    @RequestMapping(value = "/value.do")
    public CorsUser getCors(HttpServletResponse response) {
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        return new CorsUser("我是Cors");
    }

}

JsonP和CORS的比较

  1. JSONP 只能实现 GET 请求,而 CORS 支持所有类型的 HTTP 请求
  2. 使用 CORS 可以使用普通的 XMLHttpRequest 发起请求和获取数据,比 JSONP 有更好的错误处理
  3. CORS 的兼容性比不上 JSONP,一些比较老的浏览器只支持 JSONP
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值