golang实现跨域访问的方法
程序员文章站
2022-06-16 20:39:23
前端通过ajax来获取服务器资源时,会存在跨域问题。因为ajax只能同源使用(预防某些恶意行为),所以当访问不在同一个域中的资源时,就会出现跨域限制。尤其在开发和测试时,跨...
前端通过ajax来获取服务器资源时,会存在跨域问题。因为ajax只能同源使用(预防某些恶意行为),所以当访问不在同一个域中的资源时,就会出现跨域限制。尤其在开发和测试时,跨域问题会给前端测试带来非常不便。
不过cors(cross-origin resource sharing,跨域资源共享)解决了这个问题,它背后的基本思想是:使用自定义的http头部让浏览器与服务器进行沟通,从而决定请求或响应是否应该成功。cors需要浏览器和服务器同时支持。整个cors通信过程,浏览器是自动完成,而服务器需要手动配置。
ajax.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <script> function loadxmldoc() { var xmlhttp; if (window.xmlhttprequest) { xmlhttp = new xmlhttprequest(); } else { xmlhttp = new activexobject("microsoft.xmlhttp"); } xmlhttp.onreadystatechange = function () { if (xmlhttp.readystate == 4 && xmlhttp.status == 200) { document.getelementbyid("mydiv").innerhtml = xmlhttp.responsetext; } } xmlhttp.open("get", "http://127.0.0.1:8000/ajax", true); xmlhttp.send(); } </script> <title>document</title> </head> <body> <h2>cross origin</h2> <button type="button" onclick="loadxmldoc()">请求数据</button> <div id="mydiv"></div> </body> </html>
crossorigin.go
package main import ( "net/http" "html/template" "fmt" "encoding/json" ) type message struct { name string `json:"name"` msg string `json:"msg"` } func main() { http.handlefunc("/", entrance) http.handlefunc("/ajax", testcrossorigin) http.listenandserve(":8000", nil) } func entrance(w http.responsewriter, r *http.request) { t,_:=template.parsefiles("templates/ajax.html") t.execute(w, nil) } func testcrossorigin(w http.responsewriter, r *http.request) { if r.method == "get" { var message message message.name = "benben_2015" message.msg = "success" result, err := json.marshal(message) if err != nil { fmt.println(err) return } responsewithorigin(w, r, http.statusok, result) return } } func responsewithorigin(w http.responsewriter, r *http.request, code int, json []byte) { w.header().set("content-type", "application/json; charset=utf-8") w.writeheader(code) w.write(json) }
当从 http://localhost:8000/ 页面(ajax.html)通过ajax访问 http://localhost:8000/ajax 时,就会出现下图所示的错误:
解决方法: golang设置http头部相当简单,标准包有现成的方法可以使用。只要在服务器端的响应头中添加下面一句代码就可以正常访问了。
w.header().set("access-control-allow-origin", "*") //"*"表示接受任意域名的请求,这个值也可以根据自己需要,设置成不同域名
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 可牛影像怎么给图片添加砖墙纹理效果?
下一篇: 基于Python实现的恋爱对话小程序详解