• Redirect 原理


    mvc .net 中,从服务器端跳转页面有很多方法

    有些不会改变浏览器地址栏的地址,这个好理解,mvc本身的机制就是action的名字不一定是view的名字

    我们请求的不是文件名,在action中我们可以任意调用其它的action

    有些跳转方式,是会改变浏览器地址栏的

    webform的开发者常用的跳转方式,直接将js代码返回到客户端,并触发

    mvc也可以用,如

    return Content("<script language='javascript'>window.open('aaa.aspx');</script>");

    这种方法也好理解,但是另一种会改变地址栏的方法:

    Redirect

    是通过什么方式通知浏览器去重定向地址栏的呢?

    这其实是很基础的web开发知识,但是我确实不知道

    以RedirectToAction为例,

            <form action="TestRedirect" method="post">
                测试跳转
                <input type="submit" value="提交" />
            </form>
            [HttpPost]
            public ActionResult TestRedirect()
            {
                return RedirectToAction("Contact", "Home");
            }

    开始以为,是通过底层的方式注入了js,所以查看post返回的信息

    response是空的

    既然没有人为代码的干预,那可以肯定是浏览器接受到了指令,自动重定向了地址栏

    好歹记得headers在服务器端也会变,查看header

    1. Request URL:
      http://localhost:4732/Home/TestRedirect
    2. Request Method:
      POST
    3. Status Code: 
      302 Found
    4. Request Headers 
      1. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      2. Accept-Encoding:gzip,deflate,sdch
      3. Accept-Language:zh-CN,zh;q=0.8
      4. Cache-Control:max-age=0
      5. Connection:keep-alive
      6. Content-Length:0
      7. Content-Type:application/x-www-form-urlencoded
      8. Cookie:account=lizb; Comm=100076; lastpostedforum=3; visitedforums=3,2
      9. Host:localhost:4732
      10. Origin:http://localhost:4732
      11. Referer:http://localhost:4732/Home/About
      12. User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
    5. Response Headers 
      1. Cache-Control:private
      2. Content-Length:130
      3. Content-Type:text/html; charset=utf-8
      4. Date:Tue, 03 Dec 2013 06:54:06 GMT
      5. Location:/Home/Contact
      6. Server:Microsoft-IIS/8.0
      7. X-AspNet-Version:4.0.30319
      8. X-AspNetMvc-Version:4.0
      9. X-Powered-By:ASP.NET
      10. X-SourceFiles:=?UTF-8?B?YzpcdXNlcnNcYWRtaW5pc3RyYXRvclxkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXE12YzRMZWFyblxNdmM0TGVhcm5cSG9tZVxUZXN0UmVkaXJlY3Q=?=

    发现Request Headers 中,有目标地址。

    测试普通post

            [HttpPost]
            public ActionResult TestRedirect()
            {            
                return Content("test"); 
            }

    结果:

    1. Request URL:
      http://localhost:4732/Home/TestRedirect
    2. Request Method:
      POST
    3. Status Code: 
      200 OK
    4. Request Headersview source
      1. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      2. Accept-Encoding:gzip,deflate,sdch
      3. Accept-Language:zh-CN,zh;q=0.8
      4. Cache-Control:max-age=0
      5. Connection:keep-alive
      6. Content-Length:0
      7. Content-Type:application/x-www-form-urlencoded
      8. Cookie:account=lizb; Comm=100076; lastpostedforum=3; visitedforums=3,2
      9. Host:localhost:4732
      10. Origin:http://localhost:4732
      11. Referer:http://localhost:4732/Home/About
      12. User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
    5. Response Headersview source
      1. Cache-Control:private
      2. Content-Encoding:gzip
      3. Content-Length:122
      4. Content-Type:text/html; charset=utf-8
      5. Date:Tue, 03 Dec 2013 07:39:04 GMT
      6. Server:Microsoft-IIS/8.0
      7. Vary:Accept-Encoding
      8. X-AspNet-Version:4.0.30319
      9. X-AspNetMvc-Version:4.0
      10. X-Powered-By:ASP.NET
      11. X-SourceFiles:=?UTF-8?B?YzpcdXNlcnNcYWRtaW5pc3RyYXRvclxkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXE12YzRMZWFyblxNdmM0TGVhcm5cSG9tZVxUZXN0UmVkaXJlY3Q=?=

    发现没有Location这个参数

    猜测是不是有Location浏览器就会自动跳转

            [HttpPost]
            public ActionResult TestRedirect()
            {
                Response.AddHeader("Location", "/Home/Contact");
                return Content("test");                    
            }

    失败,不会跳转

    对比headers,又发现一个差异。Status Code是不一样的

    普通的post,Status Code 是 200 

    redirect post的Status Code: 是 302

    测试:

            [HttpPost]
            public ActionResult TestRedirect()
            {
                Response.AddHeader("Location", "/Home/Contact");
                Response.StatusCode = 302;
                return Content("test");                        
            }

    成功跳转,另外如果Location不存在,只修改status,也不会跳转

    结论:

    Redirect 的原理是通过修改status来通知浏览器来重定向 .

    当然,搞明白这个,或许没什么用(用这个方法来跳转页面看起来很诡异,因为貌似不管在哪种架构里都有redirect)

    不过至少涨了点zishi,StatusCode 是有很多实际意义的,之前一直不知道

    http://www.w3school.com.cn/tags/html_ref_httpmessages.asp

     




  • 相关阅读:
    go多种uuid生成方式
    go访问mysql基本语法
    go实现分布式唯一ID-snowflake(雪花算法)
    指定时间生成cron表达式
    zookeeper注册与发现
    短地址服务(二)
    java-redis
    短地址服务(一)
    cron表达式详解
    以后本blog所有内容全部转移,并在自建blog更新
  • 原文地址:https://www.cnblogs.com/yyjj/p/3455870.html
Copyright © 2020-2023  润新知