zoukankan      html  css  js  c++  java
  • 面试准备JSONP(一)

    1.如何解决跨域的问题:
         跨域:协议、域名、端口号都相同,只要有一个不相同,那么都是非同源。
         同源策略限制情况:
      1.cookie,localStorage 和 IndexDB 无法读取
      2.DOM 和 JS对象无法获得
      3.AJAX请求不能发送
      注意:对于像 img、iframe、script 等标签的 src 属性是特例,它们是可以访问非同源网站的资源的。
      跨域解决办法:
      

      ①、response 添加 header

        我们在 Servlet 请求返回时添加如下代码:

    1 //*表示支持所有网站访问,也可以额外配置相应网站
    2 resp.setHeader("Access-Control-Allow-Origin", "*");

      ②、JSONP 方式

      首先我们要修改 index.jsp 页面的 ajax 请求:

    复制代码
     1         $.ajax({
     2             type:"get",
     3             async:false,
     4             url:"http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom",
     5             dataType:"jsonp",//数据类型为jsonp
     6             jsonp:"backFunction",//服务端用于接收callBack调用的function名的参数
     7             success:function (data) {
     8                 alert(data["passWord"]);
     9             },
    10             error:function () {
    11                 alert("error");
    12             }
    13 
    14         });
    复制代码

      注意:我们修改了 dataType 的数据类型为 jsonp,并且新增了 jsop 属性值为 “backFunction”。

      ④、nginx 转发

      

    JSONP优缺点:

    1.优点

      (1)不像XMLHttpRequest对象实现Ajax请求那样受到同源策略限制,JSONP可以跨越同源策略

      (2)在浏览器中兼容性好

      (3)在请求完毕后可以哦你给过调用callback方式回传结果,将controller和view分开,jsonp服务只提供纯服务的数据,页面渲染由自己定义

    2.缺点

      (1)只支持get请求不支持post请求

      (2)只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间javascript调用问题

      (3)调用失败的时候不会返回各种HTTP状态码

      (4)安全性低,如果提供JSONP服务的一方有漏洞,他返回的javascript内容容易被人控制


    2.常见Http请求头

      http消息头,在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的组件,http消息头用来准确描述正在获取的资源,服务器或者客户端行为,定义了http事务中的具体操作参数。

      请求头:  

      GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号)
      Accept: /(客户端能接收的资源类型)
      Accept-Language: en-us(客户端接收的语言类型)
      Connection: Keep-Alive(维护客户端和服务端的连接关系)
      Host: localhost:8080(连接的目标主机和端口号)
      Referer: http://localhost/links.jsp(告诉服务器我来自于哪里)
      User-Agent: Mozilla/4.0(客户端版本号的名字)
      Accept-Encoding: gzip, deflate(客户端能接收的压缩数据的类型)
      If-Modified-Since: Tue, 11 Jul 2017 18:23:51 GMT(缓存时间)
      Cookie(客户端暂存服务端的信息)
      Date: Tue, 18 Jul 12:15:02 GMT(客户端请求服务端的时间)
     
      响应头
     
      HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK(描述信息)
      Location: http://www.baidu.com(服务端需要客户端访问的页面路径)
      Server:apache tomcat(服务端的Web服务端名)
      Content-Encoding: gzip(服务端能够发送压缩编码类型)
      Content-Length: 80(服务端发送的压缩数据的长度)
      Content-Language: zh-cn(服务端发送的语言类型)
      Content-Type: text/html; charset=GB2312(服务端发送的类型及采用的编码方式)
      Last-Modified: Tue, 18 Jul 2017 12:15:02 GMT(服务端对该资源最后修改的时间)
      Refresh: 1;url=http://www.helloyoucan.com.(服务端要求客户端1秒钟后,刷新,然后访问指定的页面路径)
      Content-Disposition: attachment; filename=aaa.zip(服务端要求客户端以下载文件的方式打开该文件)
      Transfer-Encoding: chunked(分块传递数据到客户端)
      Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务端发送到客户端的暂存数据)
      Expires: -1//3种(服务端禁止客户端缓存页面数据)
      Cache-Control: no-cache(服务端禁止客户端缓存页面数据)
      Pragma: no-cache(服务端禁止客户端缓存页面数据)
      Connection: close(1.0)/(1.1)Keep-Alive(维护客户端和服务端的连接关系)
      Date: Tue, 18 Jul 2017 12:18:03 GMT(服务端响应客户端的时间)
    如有不足的地方欢迎指正,谢谢诸位大神啦
  • 相关阅读:
    gateway 实现接口日志保存
    Spring Boot应用的Controller返回的集合类数据是XML格式的可能原因
    json 转list
    观察者模式
    Quartz定时任务整理
    java通过word模板生成word文档
    基于mysql的单据号生成(前缀+日期+自增id+后缀)
    Rabbitmq详解
    java.sql.SQLException: connection holder is null 问题处理
    为什么要用消息队列或消息队列的优缺点
  • 原文地址:https://www.cnblogs.com/menghan94/p/11182745.html
Copyright © 2011-2022 走看看