Go踩过的坑之gin重定向

作者: 五岁小孩 | 来源:发表于2021-03-11 09:00 被阅读0次

    Go踩过的坑之gin重定向

    问题重现

    实现一个web路由,请求前后会校验用户的信息,在返回页面

    // AuthorCheckService
    func AuthorCheckService() gin.HandlerFunc {
        return func(c *gin.Context) {
            //TODO 请求拦截器
            //放行
            c.Abort()
            return
        }
    }
    router.GET("/test",AuthorCheckService(),func (c *gin.Context){
               //返回页面
               c.html("index.html",gin.H{})
              //1.路由重定向
             //2.指定重定向的URL 通过HandleContext进行重定向到test2
             //3.实际开发中很少在路由中使用匿名函数,故r很难调用
            c.Request.URL.Path = "/test2"
            r.HandleContext(c)
             //url重定向(坑)
            //c.Redirect(http.StatusMovedPermanently, "/login")//301 永久移动
            //c.Redirect(http.StatusPermanentRedirect, "/logout")//308 永久重定向
            c.Redirect(http.StatusTemporaryRedirect, "/logout")//307 临时重定向
               return
          })
    
    

    301 MovedPermanently

    永久移动:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。注意:对于某些使用HTTP/1.0协议的浏览器,当它们发送的POST请求得到了一个301响应的话,接下来的重定向请求将会变成GET方式。

    307 TemporaryRedirect

    临时重定向:在这种情况下,请求应该与另一个URI重复,但后续的请求应仍使用原始的URI。 与302相反,当重新发出原始请求时,不允许更改请求方法。 例如,应该使用另一个POST请求来重复POST请求

    **308 PermanentRedirect **:

    永久重定向:请求a和所有将来的请求应该使用另一个URI重复。 307和308重复302和301的行为,但不允许HTTP方法更改。 例如,将表单提交给永久重定向的资源可能会顺利进行

    需要根据实际情况选择对应的状态码,如我在权限控制的时候,控制登录用户是否有权限访问某个模块,

    当第一次无权限访问则重定向,但是如果此时我选择的是301、308,则后续当该用户又拥有权限时,仍然无法正常访问,依旧会被重定向且后台Debug不到

    注:永久(Permanent)和临时(Temporary)的区别
    永久:是指原来访问的资源已经永久删除啦,客户端应该根据新的URI访问重定向。
    临时:是指访问的资源可能暂时先用location的URI访问,但旧资源还在的,下次你再来访问的时候可能就不用重定向了。

    相关文章

      网友评论

        本文标题:Go踩过的坑之gin重定向

        本文链接:https://www.haomeiwen.com/subject/kgugxltx.html