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是没有值的

  • 相关阅读:
    解决This application failed to start because it could not find or load the Qt platform plugin "windows
    计算几何-凸包-toleft test
    Bit Operation妙解算法题
    带线表格据gt生成无线表格
    caffe的python接口提取resnet101某层特征
    camelot工具进行pdf表格解析重建
    python批量爬取文档
    IP被封检测地址
    驱动人生后门清除方案
    应用安全
  • 原文地址:https://www.cnblogs.com/hnzheng/p/12731789.html
Copyright © 2011-2022 走看看