package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"net/http/cookiejar"
"net/url"
"crypto/tls"
"time"
)
var cookies []*http.Cookie
var client = &http.Client{}
func init() {
//跳过证书验证
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client = &http.Client{Timeout: 30 * time.Second, Transport: tr}
}
func main() {
// 用户客户端程序登录后,携带cookie,js-ajax跨域返回数据
http.HandleFunc("/getData", getData)
// 用户客户端程序登录后,携带cookie,重新定向URL页面
http.HandleFunc("/login", doLogin)
http.ListenAndServeTLS(":9966", "cert.pem", "key.pem", nil)
}
func doLogin(w http.ResponseWriter, r *http.Request) {
if login() {
http.SetCookie(w, cookies[0])
http.Redirect(w, r, "http://127.0.0.1:997/index#/home", http.StatusFound)
}
}
func getData(w http.ResponseWriter, r *http.Request) {
// 处理js-ajax跨域问题
w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
w.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的类型
w.Header().Set("content-type", "application/json") //返回数据格式是json
if login() {
resp2, err := client.Get("http://127.0.0.1:997/user/getTestData")
defer resp2.Body.Close()
if err != nil {
err := fmt.Errorf("登录后发起Get请求时,client.Get错误:%v", err)
fmt.Println(err)
return
}
if resp2.StatusCode != 200 {
err := fmt.Errorf("登录后发起Get请求时,response.StatusCode:%v", resp2.StatusCode)
fmt.Println(err)
return
}
body, err := ioutil.ReadAll(resp2.Body)
w.Write(body)
}
}
func login() bool {
form := url.Values{}
form.Set("username", "administrator")
form.Set("password", "xxxxx")
b := bytes.NewBufferString(form.Encode())
req, err := http.NewRequest("POST", "http://127.0.0.1:997/login", b)
if err != nil {
err := fmt.Errorf("登录发起post请求时,http.NewRequest错误:%v", err)
fmt.Println(err)
return false
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
jar, err := cookiejar.New(nil)
if err != nil {
panic(err)
}
client.Jar = jar
resp, err := client.Do(req)
defer resp.Body.Close()
if err != nil {
err := fmt.Errorf("登录发起post请求时,client.Do错误:%v", err)
fmt.Println(err)
return false
}
if resp.StatusCode != 200 {
err := fmt.Errorf("登录发起post请求时,response.StatusCode:%v", resp.StatusCode)
fmt.Println(err)
return false
}
cookies = resp.Cookies()
return true
}