3-9按照课程的代码好像返回的内容并没有被拦截修改
来源:4-9 返回内容随心改2

慕前端904247
2020-04-28
- 描述 : 按照牛儿老师的课程步骤走了一边发现没有达到目的效果,反复勾兑了老师的代码后没有发现问题所在以下是效果图&httputil.ReverseProxy{Director: director,ModifyResponse:modifyfun},的modfiyfun似乎没有起到作用请老师指点一二
- 这个是server.go的代码
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
type RealServer struct {
Addr string
}
func main() {
//新建两个端口监听
rs1 := &RealServer{Addr:"127.0.0.1:8081"}
rs2 := &RealServer{Addr:"127.0.0.1:8082"}
//启动运行
rs1.Run()
rs2.Run()
//监听系统关闭的信号
quit := make(chan os.Signal)
signal.Notify(quit,syscall.SIGINT,syscall.SIGTERM)
<-quit
}
//启动方式
func(r *RealServer) Run() {
log.Println("Start HttpServer is "+ r.Addr)
mux := http.NewServeMux()
mux.HandleFunc("/",r.HelloHandle)
mux.HandleFunc("/base/error",r.ErrorHandler)
server := &http.Server{
Addr: r.Addr,
WriteTimeout:time.Second*3,
Handler: mux,
}
go func() {
log.Fatal(server.ListenAndServe())
}()
}
//处理的路由函数
func(r *RealServer) HelloHandle(w http.ResponseWriter,req *http.Request) {
log.Println(req.Host)
//构建请求路径
urlpath:= fmt.Sprintf("http://%s%s\n",r.Addr,req.URL.Path)
realIP := fmt.Sprintf("RemoteAddr=%s,X-Forwarded-For=%v,X-Readl-Ip=%v\n",
req.RemoteAddr,req.Header.Get("X-Forwarded-For"),req.Header.Get("X-Real-Ip"))
io.WriteString(w,urlpath)
io.WriteString(w,realIP)
}
func (r *RealServer) ErrorHandler(w http.ResponseWriter,req *http.Request){
upath:= "error Handler"
w.WriteHeader(500)
io.WriteString(w,upath)
}
- 这个是customModifyResponproxy.go的代码
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/httputil"
"net/url"
"strings"
)
var add = "127.0.0.1:8085"
func main() {
rs := "http://127.0.0.1:8082/base"
//解析参数
url1 ,err:= url.Parse(rs)
if err != nil {
log.Println(err)
}
proxy := httputil.NewSingleHostReverseProxy(url1)
log.Println("Starting Listen is "+ add)
log.Fatal(http.ListenAndServe(add,proxy))
}
//手动实现一个modify的方法
func NewSingleHostReverseProxy(target *url.URL) *httputil.ReverseProxy {
//URL : http://127.0.0.1:8085/xxx?name=123
//Host = 127.0.0.1:8085
//Scheme = http
//path = xxx
//RayQuery = name=123
targetQuery := target.RawQuery
director := func(req *http.Request) {
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
if targetQuery == "" || req.URL.RawQuery == "" {
req.URL.RawQuery = targetQuery + req.URL.RawQuery
} else {
req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
}
if _, ok := req.Header["User-Agent"]; !ok {
// explicitly disable User-Agent so it's not set to default value
req.Header.Set("User-Agent", "")
}
}
modifyfun := func(r *http.Response) error {
oldPayload,err := ioutil.ReadAll(r.Body)
if err !=nil {
return err
}
//修改读取到的结构体信息
newpayload:=[]byte("修改成功结果为:"+ string(oldPayload))
//转换到新的body中
r.Body = ioutil.NopCloser(bytes.NewBuffer(newpayload))
//改写长度(因为重写的时候还是读取原来长度的所以要改写长度)
r.ContentLength = int64(len(newpayload))
fmt.Println(len(newpayload))
r.Header.Set("Content-Length",fmt.Sprint(len(newpayload)))
return nil
}
return &httputil.ReverseProxy{Director: director,ModifyResponse:modifyfun}
}
func singleJoiningSlash(a, b string) string {
aslash := strings.HasSuffix(a, "/")
bslash := strings.HasPrefix(b, "/")
switch {
case aslash && bslash:
return a + b[1:]
case !aslash && !bslash:
return a + "/" + b
}
return a + b
}
写回答
1回答
-
因为方法没有被调用。
proxy := httputil.NewSingleHostReverseProxy(url1)
替换为
proxy := NewSingleHostReverseProxy(url1)012020-04-29
相似问题