欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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实现跨域访问的方法 

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

w.header().set("access-control-allow-origin", "*")
//"*"表示接受任意域名的请求,这个值也可以根据自己需要,设置成不同域名

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