前言:
跨域問題只有通過后臺解決风题!后臺解決判导!后臺解決嫉父!重要的事情說三遍!
重點:
1.如果你是純前端眼刃,請告訴自己的后臺讓他來解決跨域問題绕辖,你就不需要看了。
2.如果你前后臺都懂擂红,但后臺不在自己手里面仪际,請看完解決辦法后,右轉(zhuǎn)使用反向代理昵骤。
3.如果你前后臺都懂树碱,而且后臺在自己手里,請繼續(xù)往下看变秦。
4.這里只提供cors的跨域解決辦法赴恨。
正文:
1.產(chǎn)生原因
它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制伴栓。
2.解決辦法
2.1 產(chǎn)生跨域請求的時候,前臺首先會向后臺發(fā)送OPTIONS請求判斷時否允許跨域雨饺。此時后臺只需要返回允許跨域的headers即可钳垮。換句話說允許跨域只需要后臺修改http header就可以解決問題。
** 后臺主要是四個header (這些是在后臺修改的额港,前臺改這個沒有用=攘!R普丁6且健!向瓷!)
2.1.1? Access-Control-Allow-Origin 允許跨域的訪問地址肠套。比如??http://localhost:8088,但也可以直接配置成通配符 *(* 這樣會產(chǎn)生前臺無法攜帶cookies的問題猖任,造成后臺session失效)
2.1.2?Access-Control-Allow-Methods 允許跨域訪問的請求方式你稚。比如 GET,POST,OPTIONS
2.1.3?Access-Control-Allow-Credentials 是否允許攜帶cookies 需要Access-Control-Allow-Origin 不為 *
2.1.4?Access-Control-Allow-Headers 允許跨域訪問的header,比如 X-Requested-With,Origin,Content-Type,application/json,Authorization,Token 這些header需要在此處配置朱躺,否則會發(fā)生 header is not allowed錯誤刁赖。
** 前臺需要添加的header(這個是在前臺添加的!3げ蟆S畛凇!T辞搿枪芒!)
2.1.5 withCredentials: true??是否允許攜帶cookies彻况,需要后臺Access-Control-Allow-Origin 不為 *。
3.例子 (提供Node.js 與 Spring MVC兩種病苗,不提供源碼反正我也是復制的自己找吧疗垛,寫的比較粗糙,大佬們見諒硫朦。)
3.1 Spring mvc?
添加一個corsfilter贷腕,全局處理訪問請求即可,filter順位要求最優(yōu)先咬展。
我這里是把對應的配置信息寫在了web.xml里面泽裳,提供對應的web.xml配置信息。
3.2 Node.js?
直接寫在app.js 處理即可涮总。
4.總結(jié)
4.1 跨域后臺改一下header就可以解決了,沒有想象中那么麻煩祷舀。
4.2 跨域post會發(fā)送兩次瀑梗,第一次是options,options通過才會發(fā)送post
4.3 如果 Access-Control-Allow-Origin設置為*裳扯,前臺會無法攜帶cookies造成后臺session無法使用抛丽。當然后臺可以用其他方式解決,比如用jwttoken然后從redis中取session數(shù)據(jù)饰豺。
4.4 付成功效果圖
4.5 Options 返回狀態(tài)碼應該是 204亿鲜。即無返回內(nèi)容狀態(tài)。