网站优化与安全
网站的优化与安全在整个网站开发中占有非常重要的地位,在开发过程中的首要问题是考虑功能如何实现,其次就是考虑如何能最大程度地提高网站运行效率和安全指数.这一仗咱们打算稍微说一点关于这方面的知识.
参考:一个完整的搜索引擎包含三个基本部分,对应不同的功能,分别是收录,索引和查询.
收录:从某些搜索网站上搜索页面的时候,并不是利用搜索网站直接从众多的网站上索取内容,而是这些网站的内容早就已经被搜索网站保存到数据库中,并且都为这些关键字建立了全文索引.收录这些网站的是一些搜索机器人,也可以成为网络机器人,网络盘虫等.它们通过一定的逻辑,从互联网上查询所有可能访问到的页面.
索引:当搜索机器人从其它网站上收录网页后,将这些网页加入到索引列表中,当用户查询关键字时,相关包含关键字的收银就会被查询出来,显示在列表中.
查询:通过使用搜索引擎的前台和后台的查询程序,可以借助关键字从搜索引擎的索引中查询出搜索机器人收录的网页.
参考:什么是SEO呢?名字听起来挺吓唬人,说白了就是搜索引擎优化,SEO的英文名称Search Engine Optimization.SEO和SEM的区别:SEO更加侧重搜索引擎的自然排名提升,即通过技术手段,通过团队和项目操作在不直接付费给搜索引擎例如baidu,google,sogou,soso等的情况下利用搜索引擎天然招聘用户的基本原则,是把搜索引擎排名的基本原理提升关键词排名的一种称呼.SEO随着搜索引擎的诞生而诞生,SEO的发展也是伴随着搜索引擎的发展而发展,SEO未来的辉煌也注定会伴随着搜索引擎的辉煌而辉煌。SEO工作者们越来越发现,如同自然界的一切法则一样,最终回归平衡,因此刻意的SEO越来越被不断升级的搜索引擎算法过滤掉,然而万变中的不变就是搜索引擎优化的核心:用户体验度。
介绍了SEO,咱们接下来看看SEO优化原则:
SEO=更多收录页面+页面内容的有好排名+其他能够使机器人感兴趣的内容.SEO优化可以增加网站被搜索引擎收录的几率.
http://jingyan.baidu.com/article/77b8dc7f217d5b6174eab626.html
参考:缓存是指系统或应用程序将频繁使用的数据保存到内存中,当系统或应用程序再次使用时,能够怀素地获取数据.缓存技术是提高Web应用程序开发效率最常用的技术,是生成高性能,可缩放的Web应用程序最重要的因素之一.
缓存的显著优点如下:
提高效率这是肯定的.
提供共享这一点可能不容易想到.
高度密封,简化查询.
简化开发过程.
应对多样化的数据.
ASP.NET缓存主要分为两大类:网页输出缓存和应用程序数据缓存.网页输出患处针对ASP.NET Page页面中的HTML进行缓存,石刻史话内容对象,例如图片,GridView表格控件,用户控件等;而应用程序数据缓存是针对应用程序内的数据缓存,例如将DataSet等数据存储到缓存之中.缓存数据是看不见的,并且多个Page页面可以共同访问应用程序的缓存数据.
参考:所谓的完整页面缓存(Full Page Chching)针对整个网页页面进行缓存,将已经生成的动/静态页面全部内容保存在服务器内存中.这种机制对那些不常更改但需要大量处理才能创建的页面特别有用.例如,如果创建大通信量的网页来显示不需要频繁更新的数据,页输出缓存则可以极大地提高该页的性能.可以分别为每个页配置页缓存,也可以在web.config文件中创建缓存配置文件.利用缓存配置文件,只定义一次缓存设置就可以再多也页中使用这些设置.
设置页的缓存可以使用以下两种方式:
1:一种是使用<%@OutputCache...%>指令声明(高级)
如果要对一个网页Page加入60秒完整网页缓存,开发人员可在.aspx网页中加入这样一段指令:
<%@ OutputChche Duration=”60” VaryByParam=”” none%>
2:一种是使用Response.Chche的页面输出缓存API(低级).
若以程序化API方式,要在后台程序代码中设置60秒的网页缓存,代码如下:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
参考:缓存后替换说白了也是一种缓存功能,它和空间缓存相反,指点的区域没有缓存,需要每次重新产生,而指定区域之外的部分则被缓存(内容不变).
例如,在开发亿个大学选课网页Page中,网页中对于课程描述与讲课老师的图像都是固定的,因此可以将Page缓存下来,称为静态内容,不必重复运算产生.但如果网页中有特定的一小块是需要变动的,如广告轮转(AdRotator),这时就是利用缓存后替换的好时机.先将整个网页缓存下来,再用广告控件AdRotator替换轮播广告内容块.
我感觉我说的这些东西大家应该能理解吧,楼主不胜言谈,但是我觉得我的已经很通俗了,如果有什么不明白不理解的地方,请留言.
参考:对称算法也称为传统算法或是单密钥算法,就是加密密钥能从解密密钥中推算出来,反之也成立,其实也就是加密密钥和解密密钥是同一个密钥.对称算法的安全性依赖于密钥,密钥已知就意味着任何人能都对消息进行加密和解密.
对称算法的加密和解密标识为:
Ek (M)=C;//通过密钥k对明文M进行加密得到密文C
Dk (C)=M;//通过密钥k对密文C进行解密得到明文M
其中,M表示的消息成为明文,E表示加密,k标识密钥,D标识解密,C标识密文.对称算法主要分为两大类:逐步加密的流算法和分组方式的分组算法.
参考:既然有MD5加密是不是有MD4加密?没错,有的.MD5以512位分组来处理输入文本,每一分组又划分16个32位子分组.算法的输出由4个32位分组组成,将它们级联形成一个128位散列值.首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数.填充方法是附一个1在消息后面,后街所要求的多个0,然后在其后附上64位的数.填充方法是附一个1在消息后,后街所要求的多个0,然后在其后附上67位的消息长度(填充前).这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此).同时确保不同的消息在填充后不相同.
总结一下:MD5算法是将任意长度的消息按512位的分组为单位进行处理,然后输出128位消息摘要.
参考:这些MD5啊,SHA啊之类的名词其实都是一些算法的名字.SHA是一种数据加密算法.该算法的思想是接受一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文.也可以简单的理解为取一串输入码(称为预映射或信息),并把他们转化为长度较短,位数固定的输出序列即散列值的过程.注意,这种SHA是一种不可逆的加密算法,那么肯定有可逆的加密算法喽?对,通过密文推导出明文就成为可逆的.
参考:MD5和SHA1加密主要通过:
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("123", "MD5")
这种形式来进行加密,这种类型的意思是对123字符串进行MD5加密算法,可能有同学可能会说,C#里面的函数有的命名是像这样的函数一样,需要穿第几个固定的字符串,可是这样的话就体现不出VS的自动提示功能,可能因为一个字符出错,而且出现这种情况的时候还不容易察觉,因为便一起不会帮我们做检查.我觉得这是问题,因为可以的话最好是能做成枚举类型,这样VS就能派上用场了!
刚才介绍了这个方法的语法如下:
public static string HashPasswordForStoringInConfigFile(string password,string passwordFormat)
参数代表的意义:
password代表要进行运算的密码.
passwordFormat代表要使用的哈希算法.passwordFormat是一个string,表示FormsAuthPassword Format枚举值之一.
参考:通过名字我们就能猜出一个大概,所谓的公开密钥算法又称为双钥密码算法,是指加密和解密密钥为两个不同的密码算法.双钥密码算法不同于单钥密码算法,它使用了一对密钥:一个用来加密,一个用来解密.通信双方事先交换密钥就可进行保密通信.其中加密密钥不同于解密密钥,加密密钥公之于众,谁都可以用,解密密钥只有解密人自己知道.
公开密钥加密技术的优点如下:
1.密钥少便于管理
2.密钥分配简单
3.不需要秘密的通道和复杂的协议来传送密钥
4.可以实现数字签名和数字鉴别
但是这样的技术也有缺点:
1.最大的缺点就是速度慢.
参考:在开发小型Web应用程序时,数据存储量小,通常采用Access数据库.由于Access属于桌面型数据库,在上传网站的过程中,必须将数据库文件和其他文件一同上传到网站服务器中,但是这样的话非常不安全.一旦被用户破解数据库的相对路径,用户在客户端便可以下载该数据库文件了.例如,用户破解某网站的数据库保存在站点App_Data目录中,在浏览器的地址栏中输入”http://192.168.1.99”/App_Data/DataBase.mdb”后,回车弹出”文件下载”对话框,单击”保存”按钮即可将该数据库下载.
解决以上问题的方法是将Access数据库文件的扩展名改为.aspx.此时再打开文件DataBase.aspx,将会出现乱码的问题.这样就放置了数据库泄露.
注意:在默认情况下,文件夹中存放文件的扩展名是不显示的,此时将无法修改文件的扩展名.通常选择”工具->文件夹选项”命令,在弹出的对话框的”查看”选项中将”隐藏一直文件类型的扩展名”复选框取消,即可显示文件的扩展名.
参考:先说一下这个问题存在的意义,为什么要修复数据库呢?在真正的开发中,一般都会在对数据库操作之前先进行一定的备份操作,玩意数据库给整坏了起码不至于啥都没了,如果支付宝这个应用程序的数据库有一天里面没东西了,或者不小心把数据库清空了,那估计得起义.所以,在对数据库进行操纵之前备份操作是必须的.同理,如果出了问题就需要修复.
JRO类是微软提供编程修复Access数据库的,主要通过JetEngineClass对象的CompactDatabase方法实现.
注意:在使用这个命名空间的时候需要引用C:\Program Files (x86)\Common Files\System\ado\msjro.dll,该DLL包含JRO命名空间,主要通过msjro.dll来实现数据库的修复.命名空间是:using JRO;引入DLL文件不用多说了吧,不会的看这里:
http://zhidao.baidu.com/question/346240477.html
实现代码如下:
protected void Page_Load(object sender, EventArgs e) { string strPathMdb = null;//数据库路径 if (!File.Exists(strPathMdb))//检查数据库是否已存在 { //数据库不存在,无法压缩,操作失败 return; } //声明临时数据库的名称 string temp = DateTime.Now.Year.ToString(); temp += DateTime.Now.Month.ToString(); temp += DateTime.Now.Day.ToString(); temp += DateTime.Now.Hour.ToString(); temp += DateTime.Now.Minute.ToString(); temp += DateTime.Now.Second.ToString(); temp = strPathMdb.Substring(0, strPathMdb.LastIndexOf("\\") + 1) + temp; //定义目标数据库的连接字符串 string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+temp; //定义目标数据库的连接字符串 string strPathMdb2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+strPathMdb; //创建一个JetEngineClass对象的实例 JetEngineClass jt = new JetEngineClass(); //使用JetEngineClass对象的CompactDatabase方法压缩修复数据库 jt.CompactDatabase(strPathMdb2,temp2); //复制临时数据库到目标数据库(覆盖) File.Copy(temp,strPathMdb,true); //最后删除临时数据库 File.Delete(temp); //操作成功 }
如果你能按照代码的方式一步步的完成,你就会发现根本不行,因为出现了无法嵌入互操作类型...请改用适用的接口 解决办法 ,修改的方法为:选中项目中引入的dll,鼠标右键, 选择属性, 把“嵌入互操作类型”设置为False。
如果出现了找不到可安装的 ISAM 主要是数据库连接串,存在问题(例如:Data Source 中间有空格.)。
参考:我怎么记得我说过这个问题呢?不管了,既然又说到了那就再来一遍,以前说的是使用ADO.NET中传递参数的方法来防止SQL注入式攻击,现在说说使用LINQ来防止SQL注入式攻击.
1.什么是SQL注入式攻击
SQL注入式攻击是在Web应用程序中的一种安全漏洞
,它可以将不安全的数据提交给应用程序,使应用程序在服务器上执行不安全的SQL命令.使用这种方式能够很轻松的登陆应用程序.例如,开发一个管理员登录功能,加入该管理员的登录名为Admin,正确的SQL语句应该为如下代码:
select count(*) from UserInfo where UserName=’Admin’
但是,如果有不开眼的用户在文本框中输入”’Admin’ or 1=1-- ”,此时的SQL语句将会被转换为如下代码:
select count(*) from UserInfo where UserName =’Admin’ or 1=1
上述SQL语句会查询出表中的所有信息,不管用户输入什么,所以程序就会认为登陆成功.
2.LINQ中如何防止SQL注入式攻击
LINQ在用于数据存取时,清除了SQL注入式攻击的存在.LINQ当执行每次查询时都加上了具体的参数.在LINQ查询语句中构建SQL查询时,提交给查询的任何输入都被当做字面值.例如,开发一个管理员登录功能,加入该管理员的登录名为Admin.在文本框中输入”’Admin’ or 1=1”后单击”登陆”按钮,LINQ将会产生如下的SQL语句:
select [ui].[UserCode],[ui].[PassWord], from [dbo].[UserInfo] as [ui] where [ui].[UserCode]=@p0
通过上述代码应该能够看出,where子句自动被加上了参数,因此用SQL注入式攻击是无法造成破坏的.
参考:还实现从两个方面来说
1.什么是脚本攻击
QQ空间都知道吧,都应该给好友留过言吧?在智能手机还不发达的时候大家应该和楼主一样一半都用电脑留言,对吧.比如说,你有个好友叫做奥巴马,奥巴马发了一条说说”章丘的大葱真好吃,”,身为好友的你给他回复了一下”配合上煎饼才是正解!”,只要奥巴马不删除它的说说,你每次只要一上他的空间都能看见这条说说对吧.但是有一天你学习了一点代码的知识,你想卖弄一下,你就给他有留了言”<script>alert(‘哈哈哈哈,这是我新学的代码,怎么样,酷不酷!’)</script>”.一切看起来如此的正常.但是你留的言可能被浏览器解释为代码,你每次去他空间逛逛,或者他的其他好友,或者是奥巴马本人,只要有人打开奥巴马的空间想进去看看,进去的瞬间都会弹出一个对话框,对吧.原因就是浏览器把你的留言解析成代码了,而没有进行转义,你的留言中包含JS代码.这可能是你不小心发现的bug,如果有好几万的用户每天都在一个网站的留下这么一段代码,那么这个网站就废了.明白我的意思吗?
前台代码:
<form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </div> <asp:TextBox ID="TextBox1" runat="server" Text="<script>alert('页面没有这个弹出框')</script>"></asp:TextBox> <p> <asp:Button ID="btnLogin" runat="server" Height="86px" OnClick="Button1_Click" Text="登陆" Width="108px" /> </p> </form>
后台代码:
protected void Button1_Click(object sender, EventArgs e) { Label1.Text = TextBox1.Text; }
就算你的代码没有按照意向的那样弹出对话框,也会报错!
2.解决办法
预防脚本攻击的主要方法就是决不信任用户录入的信息,就像SQL注入一样,只要是开发给大众使用的程序,就要防止恶意用户,其实也并不是恶意用户,可能有一部分人喜欢找别人设计的程序找bug,喜欢不走正常路,喜欢不按常理输入.我把这些人叫做黑客!我认为这是一个褒义词.
在网页上显示用户录入的字符串之前,应将其进行HTML编码.
Server.HtmlEncode()
使用这个方法来接受用户的输入字符串.不知道为何,我使用猎豹浏览器不行.如果你的也不行,给我留言,我研究一下,或者你有办法能行,也留言.
参考:我希望大家在看到对我写的东西的东西,不要以为的看一遍,也不要想着能从我的博客里获得多大的知识,如果你只是想着收获,没有想着付出,会不会太自私,如果你能给我留言,发表一些你的见解,或者关于ASP.NET的认识,哪怕是你对这个社会的认识,都是一种进步.不要一味的想着获取获取.有时候洒下一把种子给后人,也会让你很开心.
ASP.NET3.5中提供了对web.config配置节点直接加密的功能.在配置文件里有几处配置可能包含敏感信息,例如,可能把连接字符串写在web.config中,虽然这种方式咱们说过并不好,但是肯定还有人用,估计不在少数!另外,<identity>节点可能包含runtime使用模拟账户的用户名和密码,甚至可能在配置文件的appSettings里或在自定义节点里包含共享Web Service使用的密码.不管哪种情况,都不希望密码以明文的形式存储在配置文件中.
所以,咱们在有些时候可以使用System.Configuration.SectionInformation类对web.config加密和解密.
如果要加密一个配置节点,只需要调用SectionInformation类的ProtectSection方法,传递想要使用的提供程序的名字来执行加密.需要解密节点时,只需要调用SectionInformation类的UnprotectSection方法即可轻松的完成解密.演示如下:
(1).ProtectSection方法
此方法对web.config中标记的节点进行加密.
语法:
public void ProtectSection(string protectProvider)
参数说明:
protectProvider:要使用的保护提供程序的名称.默认情况下将包含以下保护提供程序加密:
a.DPAPIProtectedConfigurationProvider:使用Windows数据保护API(DPAPI)对数据进行加密和解密.
b.RSAProctedConfigurationProvider:使用RSA加密算法对数据进行加密和解密.
注意:这两个提供程序都提供对数据的强加密.但是,如果想要在多台服务器(如网络)上使用加密配置文件,则只有使用RSAProctedConfigurationProvider才能导出用于对数据进行加密的加密密钥,并在另一台服务器上导入它们.
(2).UnprotectSection方法
此方法从管理的配置节点中移除受保护的配置加密
语法:
public void UnprotectSection()
例如:对web.config中的关键配置节点进行加密,解密.首先,使用ProtectSection方法加密web.config中<connectionStrings>节点,然后使用UnprotectSection解密:
//加密 protected void btnEncrypt_Click(object sender, EventArgs e) { //Configuration对象 /*Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); ConfigurationSection section = config.GetSection("connectionStrings");//获取配置节点 //判断节点是否为空 if (section != null && !section.SectionInformation.IsProtected) { //保护所指定的节点 //这里不知道怎么回事,我只要使用RSAProtectedConfigurationProvider这个提供程序就不对,不知为何 //但是换成DataProtectionConfigurationProvider提供程序就对了, //如果有高手看到了,希望能给楼主解答一下疑惑 //另外,好多人的博客连自己都不实践一下,就贴上别人的代码,这种情况着实可恨!误人子弟! section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider"); Response.Write("OK"); //保存 config.Save(); //这里有个警告,不知道为啥 RegisterStartupScript("", "<script>alert('加密成功')</script>"); }*/ Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); ConfigurationSection section = config.GetSection("connectionStrings"); if (section != null && !section.SectionInformation.IsProtected) { section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); config.Save(); RegisterStartupScript("", "<script>alert('加密成功')</script>"); } } //解密 protected void btnDecrypt_Click(object sender, EventArgs e) { Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); //获取配置节点 ConfigurationSection section = config.GetSection("connectionStrings"); //判断节点是否为空 if (section != null && section.SectionInformation.IsProtected) { //移除保护指定的节点 section.SectionInformation.UnprotectSection(); config.Save(); //还是有一个警告,不知为何 RegisterStartupScript("", "<script>alert('解密成功')</script>"); } }
备注:因为DataProtectedConfigurationProvider有一个缺陷,加密的文件只有在本机才能解密,如果有多台服务器的话,则需要每台机单独加密,因此不利于部署。但是楼主使用RSA算法加密,怎么都不行,还望高人指点!
参考:大家都应该会使用通过地址栏传值对吧,而且通过地址栏传递的使用概率很高,你既然都知道可以通过地址栏传值来区分不同的网页或者不同的操作,某些人肯定也知道,比如你自己建立了一个ASP.NET网站,部署到服务器之后,别人登陆上了一看地址栏:http://localhost:1296/SecurityManager/System/UserInput.aspx?id=4
别人一看,吆,id=4,我把它改成id=6,或者等于一个别的数,可能无意见就能看见你的一些不希望别人看到的网页.这个时候你就需要对地址栏中要传递的值进行加密.加密后的效果:
http://localhost:1296/SecurityManager/System/UserInput.aspx?id=Upo95Y
ID这个时候成了一个随机数,这样的话,别人就不好猜测你通过地址栏传递的是一个数字啊还是字符串啊.
参考:Web安全的第一步便是身份验证,你在玩网络游戏的时候第一步应该是输入用户名密码的安全验证吧,之后才是各种类似密保卡,手机验证等其他安全验证吧.一般只有通过安全验证的用户才允许进入系统,然后被赋予一个合法的已知身份(Identity).
ASP.NET验证是通过验证提供程序(Authentication Provider)来实现的,次提供程序是通过web.config配置文件使用<authentication>进行控制的.其基本的实用语法如下:
<configuration> <system.web> <authentication mode="Windows/Forms/Passport"> </authentication> </system.web> </configuration>
ASP.NET提供了3中验证用户的模式,每一种验证模式都是通过一个独立的验证提供程序来实现的.3种验证模式分别为Windows,Forms和Passport.Windows验证通过IIS实现;Forms验证是在开发人员自己的服务器上实现;而Passport验证则是通过微软公司的订阅服务实现.
参考:基本身份验证要求用户以用户名和密码的形式提供证书以证明其标识.它是基于RFC2617提出的Internet标准.网景的Navigator和微软的IE都支持基本身份验证.用户帧数以不加密的Base64编码格式从浏览器传送到Web服务器.由于Web服务器得到的用户证书是不加密格式,因为Web服务器可以使用用户证书发出远程调用.
注意:基本身份验证只应于安全信道(通常是使用SSL建立的)一起使用,否则,用户名和密码很容易被网络监视软件盗窃.如果使用基本身份验证,应在所有页(而不是登录页)上使用SSL(安全套接字层),因为在发出所有后续请求时都传递证书.
基本身份验证的流程如下:
(1)客户向服务器请求被限制的资源
(2)Web服务器以”401 Unauthoried”进行响应.
(3)客户端浏览器接收到这条消息后,要求用户输入证件,通常是用户名和密码
(4)然后,Web服务器使用这些用户证件来访问服务器上的资源.
(5)如果炎症失败,用户证件无效,则会返回步骤(2),重新以”401 Unauthoried”响应.
(6)如果验证成功,则客户端浏览器便通过身份验证,可以访问资源.
参考:前面在们已经说过ASP.NET有3种用户验证模式:Windows验证(默认),Forms窗体验证,Passport验证.可以看出,ASP.NET和IIS一起提供验证服务.演技获ASP.NET的身份验证,必须在ASP.NET应用程序的配置文件web.config中配置<authentication>元素,上面说了.这里稍微进行一下回顾.
其实有心的同学通过上面看出来,一般都是通过<authentication>节点的mode属性来更改身份验证.
<configuration> <system.web> <authentication mode="Forms"> </authentication> </system.web> </configuration>
以上代码就为应用程序启用基于窗体的身份验证.
参考:最简单的案例就是CSDN,比如你在看见楼主的博客的时候,感觉楼主是个风流倜傥英俊潇洒的好儿郎,想发表评论,你字都打完了,单击发表按钮,这个时候出现了一个小小的对话框,提示你登录.如果你已经登陆了,你可以正常的发表评论了.
每当我们成功的开发一个网站后,网站后台需要使用Session对象判断用户的登录状态.如果程序没有判断用户登录状态,那么用户登录还有什么意义?因为非法用户可以通过地址栏访问任意一个网页,如果判断用户登录状态,非法用户则不可以通过地址栏非法访问网站后台,并且将网页重新定向到网站登录页面.
比如,拟开发了一个网站,一般的网站的名字都比较大众化,这样做是由好处的,而且还是推荐网页的文件名字反应文件的部分情况,所以说,你可能将文件的登录页的名字叫做Login.aspx对吧,我反正是一直这么起名字,我一般把网站的首页叫做Index.aspx,如果我不采取任何措施,非法用户直接在地址栏输入Index.aspx,那么就不用登陆了,直接就能访问了,对吧.但是如果我才去了措施,非法用户不管输入什么,只要他还没有登陆,就一直停留在Login.aspx页面上.
使用Session对象存放信息的语法如下:
Session[“变量名”]=”内容”;
从会话中读取信息的语法如下:
定义的一个变量=Session[“变量名”];
主要判断代码如下:这里只是简单的示范一下,具体的内容咱们日后再说:
protected void Page_Load(object sender, EventArgs e) { if (Session["UserName"]!=null) { Response.Redirect("login.aspx"); } else { Response.Write("用户"+Session["UserInfo"].ToString()+"已登录"); } }
我不知道你还记得咱们前面说过Session的值是保存在服务器的内存中的,而且不是无限保存的,默认是20分钟,所以说,如果Session对象过期或者为null,则说明用户登录超时或者用户非法登陆.
这一次咱们具体的说了说网站优化和安全,其中说到的几个比较重要的概念希望大家引起重视,因为我一般不说什么名词,也不给大家说某个名词的定义啥的,你只要能理解,只要能会用就够了.我最佩服的人是那种用萝卜白菜的方式给你讲明白原子弹发射的原理的人.