• .Net新手☞基础(Cookie、Session等)


    CSS是Cascading Style Sheets(层叠样式表)
    样式表摘要:
    有四种方式可以在HTML文件中使用样式表:
    1、在<head>区段中使用<link>元素
    2、在<head>区段的<style>元素标签内使用@import规则
    3、在文件的<head>区段中插入<style>元素标签
    4、在HTML标签内加入样式属性

    CSS样式的基本语法:
      选择器
       {
         color:#ffffff;
         font-family:"Lucida Grande",Verdana,Lucida,Arial,Helvetica,宋体,sans-serif;
       }
    一般选择器有6种:
    1、普通选择器
    直接声明某个标签的样式属性,比如:
    body
    {
      font-family:Verdana;
      font-size:9pt;
    }
    2、群选择器
    几个标签样式属性一样时,可以共同调用一个声明,样式之间用“逗号”分隔,比如:
    input,tr{font-size:9pt;}
    3、派生选择器
    可以使用派生选择器给一个标签里的子标签定义样式
    span strong
    {
       font-style:italic;
       font-weight:normal;
    }
    4、ID选择器
    可以单独为某个标签定义样式,比如有一个<div>
    <div id="mydiv">文字</div>
    然后在样式表里这样定义:
    #mydiv {background-color:Red;}
    5、类别选择器
    在CSS里用一个“点”开头表示类别选择器定义,比如:
    .10ptWhite
    {
      color:#000000;
      font-size:10pt;
    }
    在标签中,使用class="类别名"的方法调用,这个方法比较灵活,可以为不同的标签使用相同的CSS,比如:
    <div class="10ptWhite">文字</div>中,“文字”就以10pt的白色显示。
    注意:CSS是区分大小写的。
    6、伪类选择器
    CSS用4个伪类来定义链接的各种状态,分别是a:link、a:visited、a:hover和a:active,比如:
    a:link{text-decoration:none;color:#000000;}
    a:visited{text-decoration:none;color:#0000ff;}
    a:hover{text-decoration:underline;colo:#ff0000;}
    a:active{text-decoration:none;color:#000000;}
    以上语句分别定义了“链接、已访问过的链接、鼠标停在上方时、单击鼠标时”的样式。如果使用这段CSS来定义的话,链接未访问的时候是黑色无下划线;鼠标停在上方时是红色带下划线;单击鼠标时又是黑色无下划线;链接被访问过以后是蓝色无下划线的。
      注意:必须按以上顺序写,否则显示可能和预想的不一样。记住它们的顺序是LVHA。
    7、印刷伪元素
    使用印刷伪元素,可以对<p>元素的首行和首字指定印刷效果
    首行伪元素:
    实现第一行与其他行样式不同。
    格式为:p:first-line{}
    例子:p:first-line{font-variant:small-caps;color:blue}将实现将第一行以蓝色与小写字母显示
    以下样式属性可以应用于首行元素:font、color、background、word-spacing、letter-spacing、text-decoration、vertical-align、text-transform、line-height,以及clear

    首字伪元素:
    首字伪元素用于常见的印刷效果,像是将文章的第一个字改为大写或者放大。
    格式为:p:first-letter{}
    例子:p:first-letter{font-size:24;float:left}
    以下样式属性可以应用于首字元素:font、color、background、text-decoration、vertical-align、text-transform、line-height、margin properties、padding、border、float以及clear
    8、选择器中的伪元素

    如果要想在项目的所有页面上都应用该样式,那就这样做: 在web.config中的<system.web>节下加上句<pages theme="..."/>


    本地化和资源---创建多语言网站
    1、生成本地化资源
      执行“工具”----“生成本地化资源”命令即可完成本地化资源的建立。如login.aspx.resx
    2、创建多语言资源文件
      把上面生成的本地化资源复制两份,分别重命名为login.aspx.zh-cn.resx,login.aspx.en-us.resx(命名方法是  页面名.页面类型.语言代号.resx)
      其中login.aspx.zh-cn.resx中的语言都要改成英文。
    3、实现多语言切换
      (1)、选择IE浏览器“菜单”---“工具”---“Internet选项”---“常规页”---“语言”。
      (2)、单击“添加”---“选择英语(美国)”并单击“确定”。
      (3)、把列表“英语(美国)”上移到第一行,单击“确定”。
    生成本地化资源html语言会出现Culture和UICulture属性。Culture值确定与区域有关的函数,如日期、数字和货币格式等。UICulture值确定为页加载哪些资源。
    我们可以为整个站点统一应用全球化设置,在Web.config文件的<system.web>中添加如下节点即可。
    <globalization culture="auto" uiCulture="auto"/>
    4、以编程方式访问本地资源
      public string str
      {
         get {retuen (string)base.GetLocalResourceObject("newResource.Text");}
         set {tb_Username.Text=value;}
      }
    5、创建和使用全局资源
      (1)、右键单击项目,选择“添加新项”---“资源文件”,名称这里起Rescource.resx
      (2)、打开Rescource.resx文件,任意添加一个字符串资源,这里我们添加名称为GlobalResourceText,值为“欢迎光临本站,竭诚为您服务!”
      (3)、在任何页面的任何位置添加一个Label控件,单击Expressions,选择“Text”,表达式类型为Resources。ClassKey中填写全局资源文件的文件名,例如我们创建的文件名为Rescource.resx,这里我们填写Rescource。RescourceKey填写资源ID,这里我们填写GlobalResourceText。
      (4)、这样我们就完成了。
      (5)、访问全局资源很简单,如下:string s=Rescources.Rescource.GlobalResourceText;

    导航控件和站点地图
    1、为网站建立一个SiteMapPath控件。
    2、为网站新建一个站点地图文件,保留原来的名字(Web.sitemap)。
    3、打开Web.sitemap文件,修改如下:
    <?xml version="1.0" encoding="utf-8"?>
    <siteMap xmlns="http://schmas.micosoft.com/AspNet-File-1.0">
      <siteMapNode url="Default.aspx" title="首页" description="显示所有分类和板块">
        <siteMapNode url="TopicList.aspx" title="帖子列表" description="显示某一板块的主题帖">
    </siteMapNode>
    </siteMap>

    如果想关联sitemappath和web.siteMap站点地图,可以在Web.config的<system.web>节点添加
    <siteMap>
            <providers>
              <add siteMapFile="Web.sitemap" name="Websitemap" type="System.Web.XmlSiteMapProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
            </providers>
          </siteMap>
    然后设置SiteMapProvider,指向前面自定义的SiteMapProvider即可。
    <asp:SiteMapPath ID="SiteMapPath1" runat="server" SiteMapProvider="Websitemap">
            </asp:SiteMapPath>

    字符串的操作
    1、字符访问
    string s="ABCDE";
    Console.WriteLine(s[0]);ss//输出"A"
    Console.WriteLine(s.Length);//输出4
    2、打散
    string s="ABCDE";
    char[]arr=s.ToCharArray();//把字符串打散成字符数组
    Console.WriteLine(arr[0]);//输出A
    3、截取
    string s="ABCDE";
    Console.WriteLine(s.Substring(1));//从第2位开始截取一直到字符串结束,这里输出"BCD"
    Console.WriteLine(s.Substring(2,2));//从第3位开始截取一直到字符串结束,这里输出"CD"
    4、字符匹配
    string s="ABCABCD";
    Console.Write(s.IndexOf('A'));//从字符串头部开始搜索第一个匹配字符A的位置,输出0
    Console.Write(s.IndexOf('BCD'));//从字符串头部开始搜索第一个匹配字符BCD的位置,输出4
    Console.Write(s.LastIndexOf('C'));//从字符串尾部开始搜索第一个匹配字符C的位置,输出5
    Console.Write(s.LastIndexOf('E'));//从字符串尾部开始搜索第一个匹配字符E的位置,输出-1
    Console.Write(s.Contains("ABCD"));//判断字符串中是否存在另一个字符串"ABCD",输出TRUE
    5、大小写转换
    string s="aBcD";
    Console.WriteLine(s.ToLower());//转换为小写,输出abcd
    Console.WriteLine(s.ToUpper());//转换为大写,输出ABCD
    6、对齐
    string s="abcd";
    Console.WriteLine(s.PadLeft(6,'_'));//使用'_'填充字符串左边,使其扩充到6位,输出__abcd
    Console.WriteLine(s.PadRight(6,'_'));//使用'_'填充字符串右边,使其扩充到6位,输出abcd__
    7、匹配移除
    string s="__AB__CD__";
    Console.WriteLine(s.Trim('_'));//移除字符串头部与尾部的'_'字符,输出AB__CD
    Console.WriteLine(s.TrimStart('_'));//移除字符串头部的'_'字符,输出AB__CD__
    Console.WriteLine(s.TrimEnd('_'));//移除字符串尾部的'_'字符,输出__AB__CD
    8、插入和删除
    string s="ADEF"
    Console.WriteLine(s.Insert(1,BC));//输出ABCDER
    Console.WriteLine(s.Remove(1,2));//从字符串第1位开始删除2个字符,输出ADEF
    9、替换
    string s="A_B_C_D";
    Console.WriteLine(s.Replace('_','-'));把字符串中的"_"替换为"-",输出A-B-C-D
    10、分割
    string s="A,B,C,D";
    string [] arr=s.Split(',');//以','字符对字符串进行分割,返回字符串数组arr[]={"A","B","C","D"}
    11、格式化
    Console.WriteLine(string.Format("{0}+{1}={2}",1,2,1+2));
    12、连接
    string s="A,B,C,D";
    string [] arr=s.Split(',');返回字符串数组arr[]={"A","B","C","D"}
    Console.WriteLine(string.Concat(arr));//将一个字符串数组连接成一个字符串,输出“ABCD”
    Console.WriteLine(string.Join(",",arr));//以','作为分割符将一个字符串数组连接成一个字符串,输出“A,B,C,D”
    StringBuilder sb=new StringBuilder();
    sb.Append("A");


    一、Cookie
    从技术上讲,Cookie是一小段保存在客户端的数据。用户访问网站的时候,网站会给用户一个包含过期的Cookie,浏览器收到Cookie后就存放在客户端的文件夹下。以后用户每次访问网站页面的时候,浏览器会根据网站的URL在本地Cookie文件夹内查找是否存在当前网站关联的Cookie,如果有的话就连同页面请求一起发送到服务器。
    关于Cookie的知识应注意一下几点:
    (1)Cookie只是一段字符串,并不能执行。
    (2)大多数浏览器规定Cookie大小不能大于4K,每个网站不超过20个Cookie,所有网站的Cookie总和不超过300个。
    (3)除了Cookie外,几乎没有其他的方法在客户端的机器上写入数据(就连Cookie的写入操作也是浏览器进行的)。当然,连Cookie都可以通过浏览器安全配置来禁止。现在大多数网站都利用Cookie来保存一些数据(比如你的ID),以便你下次能直接“继续”以前的配置,所以建议不要轻易关闭Cookie。
       Cookie毕竟是存放客户端的,因此,不要在Cookie中保存保密信息。
        Cookie的相关操作
        /// <summary>
        /// Cookie Operate
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        ///Save Cookie
        protected void SaveCookie_Click(object sender, EventArgs e)
        {
            HttpCookie SingleValueCookie = new HttpCookie("test1");
            SingleValueCookie.Value="单值Cookie";
            SingleValueCookie.Expires = DateTime.Now.AddDays(1);
            Response.Cookies.Add(SingleValueCookie );
            HttpCookie MultiValueCookie = new HttpCookie("test2");
            MultiValueCookie.Values["key1"] = "value1";
            MultiValueCookie.Values["key2"] = "value2";
            MultiValueCookie.Expires = DateTime.Now.AddDays(1);
            Response.Cookies.Add(MultiValueCookie );
        }
        //MultiValue Cookie
        protected void MultiValueCookie_Click(object sender, EventArgs e)
        {
            HttpCookie SingleValueCookie=Request.Cookies["test1"];
            SingleValueCookie.Value = "修改后的单值Cookie";
            Response.Cookies.Add(SingleValueCookie );
        }
        //Read Cookie
        protected void ReadCookie_Click(object sender, EventArgs e)
        {
            HttpCookie SingleValueCookie = Request.Cookies["test1"];
            if(SingleValueCookie!=null )
            {
                Response.Write(string.Format("key:{0}Value:{1}<br/>","test1",SingleValueCookie.Value,SingleValueCookie.Expires ));
            }
            HttpCookie MultiValueCookie=Request.Cookies["test2"];
            if(MultiValueCookie!=null )
            {
                Response.Write(string.Format("Key:{0}Value:{1}<br/>","test2",MultiValueCookie.Value));
                foreach(string  subkey in MultiValueCookie.Values.AllKeys )
                {
                    Response.Write(string.Format("SubKey:{0}Value:{1}Expiress:{2}<br/>",subkey,MultiValueCookie.Values[subkey],MultiValueCookie.Expires ));            
                }
            }
        }
        ///<summary>
        ///Delete Cookie
        ///1、从Request对象中获取Cookie 2、把Cookie的过期时间设置为过去的时间 3、把Cookie重新写回Response中
        ///</summary>
        protected void DeleteCookie_Click(object sender, EventArgs e)
        {
            foreach (string key in Request.Cookies.AllKeys)
            {
                HttpCookie cookie=Request.Cookies[key];
                cookie.Expires = DateTime.MinValue;
                Response.Cookies.Add(cookie );
            }
        }

    二、application与session的区别
       application 是在不同的电脑上访问同一个网站,都是对同一个变量进行操作。
       session 是在不同的电脑上访问的同一个网站,但控制的都是针对自己电脑的变量。
       ASP.NET提供存储SessionID的模式:
    1、Cookie(默认)。如果客户端禁止了Cookie的使用,Session也将失效。
    2、URL。Cookie是否开启并不影响Session的使用,缺点是不能使用绝对链接。
        ASP.NET提供存储Session内容的模式:
    1、InProc(默认)。Session存储在IIS进程中(Web服务器内存)。
    2、StateServer。Session存储在独立的Windows服务进程中(可以不是Web服务器)。
    3、SqlServer。Session存储在SqlServer数据库的表中(SqlServer服务器)。
         把Session存储在独立的进程中步骤:
    第一步:打开状态服务。依次打开“控制面板”--“管理工具”--“服务”命令,找到ASP.NET状态服务一项,右键单击服务选择启动。
      如果决定使用状态服务存储Session,别忘记修改服务为自启动,以免忘记启动服务而造成网站Session不能使用。
      服务正常启动后可以观察任务管理器,其中的aspnet_state.exe进程就是状态服务进程。
    第二步:在system.web节点写入:
    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeOut="20"></sessionState>
    第三步:可序化和反序列化。可序化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称转换成字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。要使一个类可序化,最简单的方法是使用Serializable属性对它进行标记。例如:
    [Serializable]
    class MyUser
    {
      public string sUserName;
      public string ToString()
      {}
    }


          把Session存储在数据库中
    1、在命令提示窗口输入cmd,并在命令行中运行如下命令:
    C:\Windows\microsoft.net\framework\v2.0.50727\aspnet_regsql.exe -S  .\SqlExpress -E -ssadd
    其中-S指定SqlServer服务器地址,-E表示采用信任连接,-ssadd表示为SqlServer服务器添加状态服务的支持。操作结束后,可以看到数据库中多了一个ASPState数据库
    2、打开Web.config,写入下面代码:
    <sessionState mode="SQLServer" sqlConnectionString="sever=(local);Trusted_Connection=True" sqlCommandTimeOut="60"></sessionState>
    3:可序化和反序列化。


    session的使用范围:使用同一个客户端(浏览器实例)访问同一个应用程序的所有页面。

    session的大小限制:
      如果使用InPro模式的session,存储过多的数据会导致IIS进程被收回,引发session不断丢失。
      如果使用StateServer存储session,那么数据在存入session以前需要进行序列化,序列化会消耗大量的CPU资源。
      如果使用SqlServer模式的session,数据不但要序列化而且还有存储在硬盘上,更不适合存储大量的数据。

    session的生命周期
    session采用一种平滑超时技术来控制何时销毁session。默认情况下,session的超时时间是20分钟,用户保持20分钟不访问网站,则session被收回;如果在这20分钟内用户又访问了网站,那么20分钟就重新计时。这个超时时间可以通过Web.config来修改:
    <sessionState timeout="30"></sessionState>
    或者在程序中设置:
    Session.Timeout="30";
      session是否存在,不仅仅依赖TimeOut属性,下面的情况都能引起session丢失:
    1、bin目录中的文件被修改。
    2、SessionID丢失或无效。
    3、如果使用InPro模式的session,那么IIS重启将会丢失session。如果使用StateServer存储session,服务器重新启动session也丢失。
    从安全性角度考虑,建议不要使用cookieless和SqlServer模式的session。

    遍历与销毁Session
    遍历session集合
    System.Collections.IEnumerator SessionEnum=Session.Keys.GetEnumerator();
    while(SessionEnum.MoveNext())
    {
      Response.Write(Session[SessionEnum.Current.ToString()].ToString()+"<br/>");
    }
    如果仅仅是为了监视session,也可以通过trace来获得详细信息,在Web.config的system.web节点添加:
    <trace enable="true" pageOutput="true"/>

    销毁session
    Session.Abandon();

    Application全局应用程序类
    在服务器内存中存储数量较少又独立于用户请求的数据。由于它的访问速度非常的快,而且只要应用程序不停止,数据一直存在,我们通常在Application_Start的时候去初始化一些数据,在以后的访问中可以迅速访问和检索。
      右键单击网站,选择“添加新项”命令,选择全局应用程序类。
    application与session的用法差不多。唯一要注意的是,application的作用范围是整个应用程序,可能有很多用户在同一时间访问application造成混乱,因此在修改application时要先锁定application,修改完成后再解锁。代码如下:
    Application.Lock();
    Application的相关操作
    Application.UnLock();


    Cache概述
    Cache中提供的缓存过期策略:
    1、永不过期。和Application一样,缓存永不过期。
    2、绝对时间过期。缓存在某一时间过期,比如5分钟。
    3、变化时间过期(平滑过期)。缓存在某一时间内未访问则过期。
    4、依赖过期。缓存依赖于数据库中的数据或者文件中的内容。一旦数据库中某些表的数据发生变化或者文件内容发生变动,则缓存自动过期。
       缓存过期后我们就要更新缓存,ASP.NET提供两种更新策略。
    1、被动更新。缓存过期后手动进行更新。
    2、主动更新。缓存过期后在回调方法中更新。

    using System.Diagnostics;//用于精确测定时间间隔
    using System.Web.Caching;//用于缓存的策略

    Stopwatch sw=new Stopwatch();
    sw.Start();
    sw.ElapsedTicks
    //Stopwatch类用于精确测定逝去的时间,ElapsedTicks属性返回了时间间隔的计数器刻度,即系统的计数器走过了多少次。

    DataSet ds=new DataSet();
    Cache.Insert("Data",ds);//永不过期

    DataSet ds=new DataSet();
    Cache.Insert("Data",ds,null,DataTime.Now.AddSeconds(10),TimeSpan.Zero);//绝对时间过期DataTime.Now.AddSeconds(10)表示缓存10秒后过期,TimeSpan.Zero表示不使用平滑过期策略。

    DataSet ds=new DataSet();
    Cache.Insert("Data",ds,null,DataTime.MaxValue,TimeSpan.FromSeconds(10));//变化时间过期(平滑过期)。DataTime.MaxValue表示不使用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没人访问就过期。

    在这里,我们都使用Insert()方法来添加缓存。其实,Cache还有一个方法Add()方法也能向缓存中添加项。不同之处在于Add()方法只能添加缓存中没有的项,如果添加缓存中已有的项将失败(但不抛出异常),而Insert()方法能覆盖原来的项。

    注意,和application不同,这里不需要使用在插入缓存的时候进行锁操作,Cache会自己处理并发。

    缓存的回调功能让缓存过期后自动续建实现自动更新。
    Cache.Insert("Data",ds,null,DataTime.Now.AddSeconds(10),TimeSpan.Zero,CacheItemPriority.Default,CacheRemovedCallback)

    移除缓存:Cache.Remove("Data");


    以人为本的Profile
    可以使用Profile制作个性化页面
       <!--设置Profile-->
          <anonymousIdentification enabled="true"/>
          <profile automaticSaveEnabled="true ">
            <properties>
              <group name="UI">
                <add name="ForeColor" defaultValue="Black" allowAnonymous="true " type="string"/>
                <add name="EnableBold" defaultValue="fale" allowAnonymous="true " type="bool"/>
              </group>
            </properties>
          </profile>

    说明:
    1、<anonymousIdentification enabled="true"/>表示对匿名用户也启用Profile,系统会给匿名用户分配一个随机字符串组成的ID。
    2、<profile automaticSaveEnabled="true ">表示自动在页面请求结束的时候保存Profile的设置到数据库中。
    3、<properties>就是正式定义Profile的格式了,在每一个<group>中的才是真正的Profile。name表示Profile的名字,defaultValue表示默认值,allowAnonymous表示匿名用户是否可以使用,type表示数据类型。

    调用Profile的方法是:
    Profile.UI.ForeColor=ddl_TextColor.SelectedValue;
    Profile.UI.EnableBlod=cb_IsBlod.Checked;

    Profile总结
    1、存储物理位置:客户端Cookie/URL和服务器数据库
    2、存储类型限制:可序列化类型
    3、状态使用范围:当前请求的上下文。对每个用户独立
    4、存储大小限制:任意大小,读取写入频繁的数据不建议存入Profile
    5、生命周期:    与关联的Cookie的生命周期一样
    6、安全与性能:  数据总是存储在服务器端,安全性比较高,但不易存储过多数据。
    7、优缺点与注意事项:可以方便的保存用户(匿名用户和已登录用户)的设置。


    其他
    QueryString
    在很多时候我们希望跨页面传输数据,最常用的方法是使用GET方法提交数据。也就是在URL中附加一段QUERYSTRING(类似news.aspx?ID=1这样的效果),因此,有的时候我们不需要通过程序就能传输QUERYSTRING。不过,应注意一下几点:
    1、IE浏览器对URL长度限制在2083个字符内。由于QUERYTRING是在URL中传输的,所以也受到了限制。
    2、在URL中传输的数据都是明文的,而且客户端随时可以更改,因此,不要传输敏感数据。
    3、在URL中传汉字或者一些特殊字符需要进行URL编码后传递,接受的时候再反编码,否则传递的数据可能出现乱码或者被截取。
    string s="编程快乐!@#$%&*()";
    Response.Redirect(Request.Url.AbsolutePath+"?data="+HttpUtility.UrlEncode(s));
    接受的时候:
    if(Request.QueryString["data"]!=null)
    Response.Write(HttpUtility.UrlDecode(Request.QueryString["data"]));


    强类型DataSet
    1、单击右键,选择“添加新项”--“数据集”,并改名为GuestBook
    2、在"TableAdapter配置向导"对话框选择一个数据连接,一直单击下一步,到完成。
    ASP.NET不仅为我们生成强类型数据集,而且还能自动根据输入的select查询语句生成一系列CRUD操作方法:
    1、填充DataTable。把数据填充到传入的DataTable中
    2、返回DataTable。返回包含数据的DataTable。
    3、插入修改和删除操作。直接对单个行进行插入、更新和删除操作。
    程序如下:
    GuestBookTableAdapters.tbGuestBookTableAdapter top = new GuestBookTableAdapters.tbGuestBookTableAdapter();
            top.Insert(Guid.NewGuid(), tb_UserName.Text, DateTime.Now, tb_Message.Text, false ,"Good");
            ClientScript.RegisterStartupScript(this.GetType(),"","<script>alert('发表成功')</script>");


    请求上下文
    防图片盗链、防文件下载及IP黑名单   通过HttpHandler和HttpModule,能在一个更高的层次来控制请求。
    在.NET中将几个内置对象和其他几个与上下文有关的对象捆绑在一起,形成一个内部多项HttpContext,来跟踪HTTP请求的上下文。
    HttpContext中几个比较重要的内置对象
    1、Applilcation
    2、ApplilcationInstance
    3、Cache
    4、Session
    5、Request
    6、Response
    7、Server
    8、Trace
    9、User
    10、Profile

    HttpHandler
    配置IIS
    在IIS中新建一个虚拟目录,然后指向我们的程序集。右键单击虚拟目录,选择属性,会看到“虚拟目录选项卡”选项卡,选择“虚拟目录”选项卡,选择“配置”,将弹出“应用程序配置窗口”,单击“添加”,跳出“添加/编辑应用程序扩展名映射”窗口,在“可执行文件”后输出:“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”
    在“扩展名”后输人:.jpg,单击确定。利用同样的方法注册.gif、.png等。这样设置的这些指定的图片扩展名就由我们的应用程序来处理了。


    ASP.NET安全机制
    安全相关的名词:
    1、身份验证。许多Web应用程序的一个重要部分是能够识别用户和控制对资源的访问。确定请求实体的标识的行为称为身份验证。通常,用户必须提供凭证(如名称/密码对)才能进行身份验证。
    2、授权。一旦经过身份验证的标志可用,就必须确定该标志是否可以访问给定的资源,此过程称为授权。ASP.NET与IIS一起使用为应用程序提供身份验证和授权服务。
    3、模拟。在默认情况下,ASP.NET使用本地系统账号的权限执行(而不是请求的用户),使用模拟后,ASP.NET应用程序可以用发出请求的用户的Windows标志(用户账户)执行。
    4、基于角色的安全性。对于一个庞大的用户系统,我们不能为每一个用户都单独授权,如果把用户分成不同的角色,然后对角色进行授权,那么这个工作就简单了。

  • 相关阅读:
    make输出全部重定向到文件
    python selenium-webdriver 元素定位(三)
    通过vmware 启动cloudera-quickstart-vm-5.10.0-0-vmware.zip镜像无法启动。
    编写第一个python selenium-webdriver程序(二)
    sublime Text3 新建文件时定义模块
    python selenium-webdriver 环境搭建(一)
    gitlab 添加SSH Key
    python 使用 'python -m pip install --upgrade pip'提示PermissionError: [WinError 5] 拒绝访问
    bitnami gitlab 配置域名
    bitnami gitlab 安装
  • 原文地址:https://www.cnblogs.com/Mygirl/p/2094827.html
Copyright © 2020-2023  润新知