一、http的重定向
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
package main
import (
"errors"
"fmt"
"net/http"
)
func redirectLimitTimes() {
// 限制重定向的次数
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
if len(via) > 10 {
return errors.New("redirect too times")
}
return nil
},
}
request, _ := http.NewRequest(
http.MethodGet,
"http://httpbin.org/redirect/20",
nil,
)
_, err := client.Do(request)
if err != nil {
panic(err)
}
}
func redirectForbidden() {
// 禁止重定向
// 登录请求,防止重定向到首页
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
request, _ := http.NewRequest(
http.MethodGet,
"http://httpbin.org/cookies/set?name=poloxue",
nil,
)
r, err := client.Do(request)
if err != nil {
panic(err)
}
defer func() {_ = r.Body.Close()}()
fmt.Println(r.Request.URL)
}
func main() {
// 重定向
// 返回一个状态码,3xx 301 302 303 307 308
redirectForbidden()
}