zoukankan      html  css  js  c++  java
  • cookie 身份验证及跨域

    先简单说一下 Request 和Response 对象:

    Request:用户在client使用Web浏览器向Web应用程序发出请求时,会将client信息发给server。server收到一个HTTP请求,包括了全部查询字符串參数或表单參数、Cookie数据以及浏览器信息。

    Request对象主要是让服务器取得客户端浏览器的一些数据,包括从HTML表单用Post或者GET方法传递的参数、Cookie和用户认证。因为Request对象是Page对象的成员之一,所以在程序中不需要做任何的声明即可直接使用

    Response:封装了Webserver对client请求的响应,用来操作HTTP对应信息,将结果返回给请求者,Request和Response都有非常多属性和方法。初识阶段仅仅重点会用Response对象的Redirect和Write方法。Request对象的Form和QueryString集合

    Response对象用语输出数据到客户端,包括向浏览器输出数据、重定向浏览器到另一个URL或向浏览器输出Cookie文件

    1、

    Cookie实际上是一小段文本信息(上限为4kb),保存在客户端。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器可以把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务还可以根据需要修改Cookie的内容。
    2 cookie 的相关属性

     

     3 、通过cookie 进行简单的身份验证

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace 权限验证.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                ViewBag.Title = "Home Page";
                // 模拟登录
                //if (Request.Form["Type"].ToString() == "1")
                Login();
                return View();
            }
    
    
            public string GetCookie()
            {
                var cookie = Request.Cookies["UserInfo"];
                if (cookie != null)
                {
                    return $"{cookie.Value}";
                }
                return "请先登录";
            }
            public void Login()
            {
                // 大多数浏览器支持4KB左右的cookie数据
                string userName = Request.Form["UserName"];
                string passward = Request.Form["Passward"];
                {
                    if (userName == "hnzheng" && passward == "123")
                    {
                        //创建方式1
                        {
                            HttpCookie httpCookie = new HttpCookie("UserInfo");
                            // 可以md5 加密一下
                            httpCookie.Value = $"{userName}|{passward}";
                            httpCookie.Domain = "localhost";
                            httpCookie.Expires = DateTime.Now.AddDays(1);// 设置过期时间
                            Response.Cookies.Add(httpCookie);
                        }
                        //创建方式2
                        {
                            //Response.Cookies["UserInfo"]["Name"] = userName;
                            //Response.Cookies["UserInfo"]["Passward"] = passward;
                            //Response.Cookies["UserInfo"].Expires = DateTime.Now.AddDays(1);
                        }
    
                    }
                    else Response.Write("用户名或密码错误"); ;
                }
    
            }
    
            public string LoginOut()
            {
    
                var s = Request.Cookies["UserInfo"];
                if (s != null)
                {
                    //下面这句必须有,通过修改的方式设置无效,通过remove实际上不能移除
                    s.Expires = DateTime.Now.AddDays(-30);
                    Response.Cookies.Add(s);
                    // 以下方式无效
                    //Response.Cookies.Remove("UserInfo");
                }
    
                return $"退出成功";
            }
        }
    }
    

      前端:

    4 、 浏览器跨域问题,不同域之间 cookie 是不共享的,好比不认识的两个人,money 不可能共享。这个问题可以借助 domain  来解决。使用父子域的形式,所有的子域都是用 父域的cookie.

    如下举例:

    主站点:www.study.com

    a网站:a.study.com

    b网站:b.study.com   

    c网站:c.study.com

    以上三个网站的cookie 是互不共享的,所以可以设置主站点的cookie 的Domain 为 ".study.com"

    这样 全部都可以使用cookie,

    设置主站的cookie:

    (1)解决A、B、C三个分站能同时访问主站的同一个Cookie的设置,该设置是在主站设置的

       HttpCookie tokenCookie = new HttpCookie("Name");
           tokenCookie.Values.Add("Value", Value);
           tokenCookie.Domain = ".study.com";
           tokenCookie.Path = "/";
           tokenCookie.Expires = DateTime.Now.AddDays(365);
           Response.AppendCookie(tokenCookie);

    (2) 分站清除cookie:

    HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies["CookieName"];
                if (cookie != null)
                {
                    cookie.Expires = System.DateTime.Now.AddDays(-1);//设置过期
                    cookie.Domain = ".passport.com";//设置主域名,主要这一步
                    Response.Cookies.Add(cookie);//应用Cookie设置
                }

    经过以上三步,跨域的访问和清除就都解决了,A、B、C任一站点都可以访问主站的Cookie,同时,当A、B、C任一站点做了清除Cookie操作,则其他站点将会获取的Cookie是没有值的

  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/hnzheng/p/12731789.html
Copyright © 2011-2022 走看看