经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
golang实现跨域访问的方法
来源:jb51  时间:2019/1/31 9:05:34  对本文有异议

前端通过Ajax来获取服务器资源时,会存在跨域问题。因为Ajax只能同源使用(预防某些恶意行为),所以当访问不在同一个域中的资源时,就会出现跨域限制。尤其在开发和测试时,跨域问题会给前端测试带来非常不便。

不过CORS(Cross-Origin Resource Sharing,跨域资源共享)解决了这个问题,它背后的基本思想是:使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是否应该成功。CORS需要浏览器和服务器同时支持。整个CORS通信过程,浏览器是自动完成,而服务器需要手动配置。

ajax.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <script>
  9. function loadXMLDoc() {
  10. var xmlhttp;
  11. if (window.XMLHttpRequest) {
  12. xmlhttp = new XMLHttpRequest();
  13. }
  14. else {
  15. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  16. }
  17. xmlhttp.onreadystatechange = function () {
  18. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  19. document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
  20. }
  21. }
  22. xmlhttp.open("GET", "http://127.0.0.1:8000/ajax", true);
  23. xmlhttp.send();
  24. }
  25. </script>
  26. <title>Document</title>
  27. </head>
  28. <body>
  29. <h2>cross origin</h2>
  30. <button type="button" onclick="loadXMLDoc()">请求数据</button>
  31. <div id="myDiv"></div>
  32. </body>
  33. </html>

crossorigin.go

  1. package main
  2.  
  3. import (
  4. "net/http"
  5. "html/template"
  6. "fmt"
  7. "encoding/json"
  8. )
  9.  
  10. type Message struct {
  11. Name string `json:"name"`
  12. Msg string `json:"msg"`
  13. }
  14.  
  15. func main() {
  16. http.HandleFunc("/", Entrance)
  17. http.HandleFunc("/ajax", TestCrossOrigin)
  18. http.ListenAndServe(":8000", nil)
  19. }
  20.  
  21. func Entrance(w http.ResponseWriter, r *http.Request) {
  22. t,_:=template.ParseFiles("templates/ajax.html")
  23. t.Execute(w, nil)
  24. }
  25.  
  26. func TestCrossOrigin(w http.ResponseWriter, r *http.Request) {
  27. if r.Method == "GET" {
  28. var message Message
  29. message.Name = "benben_2015"
  30. message.Msg = "success"
  31.  
  32. result, err := json.Marshal(message)
  33. if err != nil {
  34. fmt.Println(err)
  35. return
  36. }
  37. ResponseWithOrigin(w, r, http.StatusOK, result)
  38. return
  39. }
  40. }
  41. func ResponseWithOrigin(w http.ResponseWriter, r *http.Request, code int, json []byte) {
  42. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  43. w.WriteHeader(code)
  44. w.Write(json)
  45. }

当从 http://localhost:8000/ 页面(ajax.html)通过ajax访问 http://localhost:8000/ajax 时,就会出现下图所示的错误:

 

解决方法: golang设置HTTP头部相当简单,标准包有现成的方法可以使用。只要在服务器端的响应头中添加下面一句代码就可以正常访问了。

  1. w.Header().Set("Access-Control-Allow-Origin", "*")
  2. //"*"表示接受任意域名的请求,这个值也可以根据自己需要,设置成不同域名

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号