Vue:前后端数据联调

前言

前后端分离以后,数据的获取渲染都由前端完成。后台只提供纯粹的数据,以JSON为主。因此在获取数据的过程中会遭遇诸如跨域、HTTP请求错误、前端提交数据格式错误等诸多问题。因此本文将结合自身开发经验,讨论在前后端分离过程中,数据获取的一些经验。

什么是跨域?

这些年我们处理过的跨域——援引博客园 幻精灵的一篇文章,本文详细的介绍了什么是跨域,以及相关的跨域方法

JAVA中的解决方法

常规跨域请求Http Header 设置

      response.setHeader("Access-Control-Allow-Origin", "domain");//设置能够访问的域,"*"为任意可访问
      response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");//设置能够访问的http method
      response.setHeader("Access-Control-Allow-Headers", "Token,Origin, X-Requested-With, Content-Type, Accept");//设置能够访问的http header
      response.setHeader("Access-Control-Max-Age", "3600");//设置超时时间

 如前端(通常指JavaScript的AJAX)需要在请求后端后访问后端设置的某一Http Header,则后端需要设置响应跨域许可,如下:
    response.setHeader("Access-Control-Expose-Headers","Token");//设置响应能够访问的http header

其中这条规则

response.setHeader("Access-Control-Expose-Headers","Token");//设置响应能够访问的http header

需要小本本记下来,后文将会提到

前端在跨域中的实践

推荐跨域工具——axios

axios——现代浏览器的ajax工具,支持promise的用法,解决前端异步方法中回调地狱问题,支持标准的GET POST PUT DELETE等请求方法。在node上通过配置axios请求,也支持流的处理。

一般使用方法

import axios from 'axios'; // 通过npm安装模块化后进行引用


axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8';// 将HTTP请求中body设置为JSON格式,默认为表单提交


axios.get(URL, {headers:{ session: 'bamboocloud'}, timeout: 15000 }) 

  .then(res => {

    // TODO 

  })

  .catch(err => {

    console.log(err.response)

  })                                 

通过GET方法请求后台提供的API接口,其中第二个对象为设置参数,这里新增了一个请求头session,值为bamboocloud,设置了超时时间,以ms为单位。一般来说,我们把认证相关信息如session、token等放在请求头中,这样后台就能通过

@RequestHeader("XXX")

 String XXX 注解获取我们传过去的请求头。

在then方法中返回的res是axios返回的对象,它有如下的数据结构
{

//`data` is the response that was provided by the server

  data:{},
//`status` is the HTTP status code from the server response

  status:200,
//`statusText` is the HTTP status message from the server response

  statusText:'OK',
// `headers` the headers that the server responded with

// All header names are lower cased

  headers:{},
//`config` is the config that was provided to `axios` for the 
requestconfig:{},
//`request` is the request that generated this response
// It is the last ClientRequest instance in node.js (in redirects)
//and an XMLHttpRequest instance the browser
request:{}
}

其中data就是后台返回给我们的实际对象,status是请求的状态,注意,只有2XX才会走then回调,即成功回调。4XX,5XX都会走catch回调,如果没有写catch,则会抛出报错信息到全局,err是这个错误对象信息。

如果后台设置了错误信息,比如错误也会带body,那么通过err.response获取。

headers是这个请求的响应头,默认只有content-type,cookie能够被获取到。

想加载后台给我们的自定义header,一定要设置前文提到的

Access-Control-Expose-Headers。

常见误区

  1. 因为前后端分离,因此部署网页的服务器和提供API的服务器不是一台服务器。因此常见于后台通过创建session标记一个客户端的方法会失效。请求html文档,和axios请求方法会创建两个不同的session

  2. 因为默认是跨域的,而跨域默认是不带cookie的,推测这个是导致session不一致的原因(未验证)。可以通过设置{ withCredentials = true },让axios请求携带cookie,注意这种方法,后台

    Access-Control-Allow-Origin 不能设置为 * ,必须指定具体的域名或者IP地址

  3. 后台传输JSON一定要添加@ResponseBody注解,否则会报404错误,建议在controller类上添加该注解

推荐的实践

在开发环境中,可以允许所有跨域。但是建议部署到生产环境,设置为指定IP地址或者域名提高安全性。

就是这样:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,673评论 18 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,186评论 22 257
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,694评论 24 1,002
  • 认真分析mmap:是什么 为什么 怎么用http://www.cnblogs.com/huxiao-tee/p/4...
    love紫川阅读 4,323评论 0 9
  • 仅以此诗送别毕业的师兄+好友 昨日才逢黔师大,今昔又别恨匆匆。 四年光阴似流水,百花依旧笑春风。 鸟随鸾凤方飞远,...
    杨一说阅读 327评论 0 3