概念
正向代理
正向代理是一种客户端代理技术,帮助客户端访问无法访问的服务器资源,可以隐藏客户端的真实ip
反向代理
服务器端的代理技术,帮助服务器负载均衡、缓存、安全校验,可以隐藏服务器的真实ip
正向代理实现
实现原理:正向代理服务器接收到客户端到request请求,把request拷贝为自己的request发送给服务器,并把服务器返回的数据包装给客户端
type Pxy struct {
}
func (p *Pxy) ServeHTTP(rw http.ResponseWriter,req *http.Request) {
fmt.Printf("正向代理接收到请求:%s %s %s\n",req.Method,req.Host,req.RemoteAddr)
transport:=http.DefaultTransport
//浅拷贝
outReq:=new (http.Request)
*outReq = *req
if clientIP,_,err :=net.SplitHostPort(req.RemoteAddr); err==nil{
if prior,ok:=outReq.Header["X-Forwarded-For"];ok{
clientIP = strings.Join(prior,", ")+", "+clientIP
}
outReq.Header.Set("X-Forwarded-For",clientIP)
}
//把消息利用该正向代理服务器发送给下游
res,err:=transport.RoundTrip(outReq)
if err!=nil{
rw.WriteHeader(http.StatusBadGateway)
return
}
//把下游得到的数据返回给上游
//复制头部信息
for key,value:=range res.Header{
for _,v := range value{
rw.Header().Add(key,v)
}
}
rw.WriteHeader(res.StatusCode)
io.Copy(rw,res.Body)
res.Body.Close(