go+cookie+angular踩过的坑

出现问题

  • go后端在设置路由的时候,响应头设置带有cookie。但是angular向该接口发起post请求的时候,返回的数据没有cookie

原因和解决办法

  • cookie在跨域请求的时候,会丢失。因此我们在angular项目中设置代理

解决

  • go后端代码

    • 后端功能:接收angular向SetCookie接口发起的post请求数据,将该数据转化为cookie值
    package main
    
    import (
    
    ​    "net/http"
    
    ​    "io/ioutil"
    
    ​    "encoding/json"
    
    ​    "fmt"
    
    )
    
    
    type UpLoadMes struct{
    
    ​    Text string
    
    ​    Picture []string
    
    }
    
    
    type Login struct {
    
    ​    Name string `json:"name"`
    
    ​    Num string `json:"num"`
    
    }
    
    
    
    func main(){
    
    ​    fmt.Println("正在监听8080......")
    
    ​    http.HandleFunc("/SetCookie",SetCookie)
    
    ​    http.ListenAndServe(":8080",nil)
    
    }
    
    
    func SetCookie(w http.ResponseWriter, r *http.Request){
    
    ​    if r.Method!="POST"{
    
    ​        fmt.Println(r.Method)
    
    ​        return
    
    ​    }
    
    ​    w.Header().Set("Access-Control-Allow-Origin", "*")
    
    ​    w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
    
    ​    w.Header().Set("content-type", "application/json")
    
    ​    w.Header().Set("content-type", "application/x-www-form-urlencoded")
    
    ​    body,err:=ioutil.ReadAll(r.Body)
    
    ​    defer r.Body.Close()
    
    ​    if err!=nil{
    
    ​        panic(err)
    
    ​    }
    
    ​    var loginData Login
    
    ​    err=json.Unmarshal(body,&loginData)
    
    ​    if err!=nil{
    
    ​        panic(err)
    
    ​    }
    
    ​    fmt.Println(loginData)
    
    ​    cookie := http.Cookie{Name: loginData.Name, Value:loginData.Num, MaxAge: 60}
         //MaxAge表示cookie能存活的时间
    
    ​    w.Header().Set("Set-Cookie",cookie.String())
    
    ​    data := make(map[string]string)
    
    ​    data["name"] = loginData.Name
    
    ​    json,err := json.Marshal(data)
    
    ​    if err!=nil{
    
    ​        panic(err)
    
    ​    }
    
    ​    w.Write(json)
    
    }
    
  • angular项目中设置代理

    • 在项目生成名字为proxy.conf.json的代理文件

  • 在该文件写入

    {
        "/test":{
            "target":"http://localhost:8080",
            "sercure":false,
            "logLevel":"debug",
            "changeOrigin":true,
            "pathRewrite":{
                "^/test":""
            }
        }
    }
    
  • 在angular.json文件中写入

  • angular发起请求部分

      loginSubmit(name:string,num:string){
        if(name==null||name==undefined){
          console.error("onSubmit name有误")
          return
        }
        if(num==null||num==undefined){
          console.error("onSubmit num有误")
          return
        }
        if(name==""&&num==""){
          console.error("name and num 都是空的")
          return
        }
        var httpOptions={
          headers:new HttpHeaders({'content-Type':'application/x-www-form-urlencoded'}),
        }
        var api="/test/SetCookie"
        // /test/SetCookie 相当于 http://localhost:8080//SetCookie
        return this.http.post(api,{"name":name,"num":num},httpOptions).pipe(
          catchError(this.handleError)
        )
      }
    

注意

  • 根据上面设计之后,在cookie的有效期内,angular发起的大部分的请求都会带上cookie
posted @ 2019-09-10 11:40  Myuniverse  阅读(432)  评论(0编辑  收藏  举报