这个标题好长啊。

原本是没打算写下这一篇的,因为觉得身份验证到了登出之后,就算完成了。可是后来有博友提出疑问,登出之后,点击浏览器上的后退按钮,还是可以退回到登出前页面,起不到身份验证的作用。

事实上,就算使用后退按钮回到原来的页面,也只能看看页面内容,而不能对网页进行操作。一但进行操作的话,还是会需要重新登录的。

也许,有些朋友对页面的安全性要求比较高,连看都不想让人家看到。那这要怎么办?

这要从浏览器的缓存说起了。在N久以前,网络的宽带慢的是很慢很慢,所以,浏览器都有一个叫做“缓存”的功能。当你浏览了网页之后,就会把这个网页先缓存到本地计算机中,等你下一次再访问该网页时,浏览器会将缓存到本机计算机中的内容与服务器上的内容进行比较,如果没有更新,就不从服务器上读取网页,而是直接显示本地计算机中缓存的内容。这样做有两个好处,第一、客户端可以快速打开网页,节省等待的时间;第二、减少服务器压力。

所以,这个功能就一直保留了下来,直到今天、明天或者后天。

如果想不让浏览器缓存网页,最简单的方法就是使用HTML代码来实现,如以下代码所示。

[xhtml] view plaincopyprint?
  1. <meta http-equiv="Cache-Control" content="no-cache" />
  2. <meta http-equiv="Pragma" content="no-cache" />
  3. <meta http-equiv="Expires" content="-1" />

<meta http-equiv="Cache-Control" content="no-cache" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" />

以上代码应该放在<head>和</head>之间,第一句是HTTP 1.1标准中支持的,让浏览器不缓存网页内容;第二句是HTTP 1.0标准中支持的,让浏览器不缓存网页内容。因为不知道用户浏览器支持什么标准,所以可以把两句都加上。第三句,指定是网页过期时间,一般来说content值都是指定的一个时间,在这个时间之前,浏览器会显示缓存中的内容,这个时间之后,才会从服务器中读取新内容。如果为0或负数,那么就说明浏览器永远都从服务器中读取网页内容。

根据我十年前写HTML的经验,这样写就完全没有问题了。可是没想到的是……测试结果让我大跌眼镜、IE8、chrome6、Opera10和FireFox3.5下的测试全部没通过,点击浏览器的后退,还是可以看到登出后的网页。

还好,我还有九年前编写ASP的经验,于是,在.CS文件中加入了以下代码:

[c-sharp] view plaincopyprint?
  1. //禁止客户端缓存服务器上的网页
  2. Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
  3. //添加HTTP头
  4. //HTTP 1.0标准,作用相当于<meta http-equiv="Pragma" content="no-cache" />
  5. Response.AddHeader("pragma", "no-cache");
  6. //HTTP 1.1标准,作用相当于<meta http-equiv="Cache-Control" content="no-cache" />
  7. Response.AddHeader("Cache-Control", "no-cache");
  8. //设置不缓存
  9. Response.CacheControl = "no-cache";
  10. //设置在浏览器上缓存的页面的过期时间
  11. Response.Expires = -1;
  12. //从缓存中移除的日期
  13. Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);

//禁止客户端缓存服务器上的网页 Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); //添加HTTP头 //HTTP 1.0标准,作用相当于<meta http-equiv="Pragma" content="no-cache" /> Response.AddHeader("pragma", "no-cache"); //HTTP 1.1标准,作用相当于<meta http-equiv="Cache-Control" content="no-cache" /> Response.AddHeader("Cache-Control", "no-cache"); //设置不缓存 Response.CacheControl = "no-cache"; //设置在浏览器上缓存的页面的过期时间 Response.Expires = -1; //从缓存中移除的日期 Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);

曾经,在ASP中使用了类似于以上代码的代码,那真是天下无敌,无论是IE浏览器还是Netscape浏览器(多让人怀念的浏览器啊),都能完美地实现不能后退的功能。

美滋滋地进行了测试,这回,又让我跌了一次眼镜居然除了IE8(我没安装别的版本的IE)能实现不能后退的功能之外,chrome6、Opera10和FireFox3.5下的测试全部没通过。

最后,我不得不使用asp.net的绝招了,在CS中加上以下代码:

[c-sharp] view plaincopyprint?
  1. Response.Cache.SetNoStore();

Response.Cache.SetNoStore();

这回的测试结果还算满意,IE8、chrome6和FireFox3.5都通过测试,只有Opera10还是很顽强地从缓冲中读取网页内容。至于怎么让Opera浏览器也实现网页过期,目前我还没有找到方法。如果有哪位朋友知道的话,请告诉我,谢谢。

在做测试时,以上代码写在子目录的测试页里,测试方法为:先进入登录页面-->登录后进入测试页面-->进入登出页面-->单击浏览器的后退按钮回退到测试页面。

如果想在登出之后,使用后退按钮不能回退到任何一页,那么就可以在任何一个网页中加入以上代码。当然,还有一个简单的方法,在Global.asax文件中加入以下代码:

[c-sharp] view plaincopyprint?
  1. protected void Application_BeginRequest(Object sender, EventArgs e)
  2. {
  3. HttpContext.Current.Response.Cache.SetNoStore();
  4. }

protected void Application_BeginRequest(Object sender, EventArgs e) { HttpContext.Current.Response.Cache.SetNoStore(); }

最后,再建议一下,对于单个文件而言,最好在aspx文件中加上<meta>、在CS文件中将以上代码都加上,鬼才知道用户浏览器支持什么啊。还是宁多勿少吧。

转载于:https://www.cnblogs.com/sunshch/archive/2012/05/30/2526920.html

asp.net中的窗体身份验证(完整篇之六:登出后不能通过后退回来面来的页面)...相关推荐

  1. asp.net中的窗体身份验证(最简单篇)

    在创建网站中,常常会使用到身份验证.asp.net中内置了几种身份验证的方式,如Windows.Froms.Passport等.这几种身份验证的方式各有不同.一般来说,网站的身份验证方式都会经过以下几 ...

  2. asp.net中的窗体身份验证(分目录验证篇)

    在上一篇博文<asp.net中的窗体身份验证(最简单篇)>中的身份验证虽然很简单,但是有一个缺点,就是访问整个网站都必须要经过身份验证,而事实上,很多网站都不会这么要求的. 比如一个新闻系 ...

  3. asp.net中使用窗体身份验证

      第一步:设置web.config <authentication mode="Forms"></authentication>,如果web.config ...

  4. asp.net中的窗体身份验证

    入门 在创建网站中,常常会使用到身份验证.asp.net中内置了几种身份验证的方式,如Windows.Froms.Passport等.这几种身份 验证的方式各有不同.一般来说,网站的身份验证方式都会经 ...

  5. ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication) (转载)

    ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication) 收藏 转自:http://www.aspxclub.com/l12/c_3689.html 本篇文章介绍了在ASP ...

  6. 如何在Python Django中处理用户身份验证

    by Mohammed Subhan Khan 由Mohammed Subhan Khan 如何在Python Django中处理用户身份验证 (How to handle user authenti ...

  7. ASP.NET中 RequiredFieldValidator(非空验证)的使用

    ylbtech-ASP.NET-Control-Validator: RequiredFieldValidator(非空验证)的使用 ASP.NET中 RequiredFieldValidator(非 ...

  8. Windows10家庭版 解决IIS 万维网安全中没有Windows身份验证

    Windows10家庭版 解决IIS 万维网服务安全性中没有Windows身份验证(Windows Authentication) 打开启动或关闭Windows功能,IIS菜单下万维网服务的安全性缺少 ...

  9. ntlm java_Web应用程序中的NTLM身份验证(java)

    我正在使用以下过滤器在我的Web应用程序中启用NTLM身份验证. 我得到Windows浏览器身份验证提示.运行正常.除了以下事实外- 我无法确定身份验证是成功还是失败! * 两种情况均无错误. *在每 ...

  10. asp.net core中使用cookie身份验证

    背景 ASP.NET Core Identity 是一个完整的全功能身份验证提供程序,用于创建和维护登录名. 但是, cookie 不能使用基于的身份验证提供程序 ASP.NET Core Ident ...

最新文章

  1. 77所教育部直属高校公布2020年预算,清华超300亿!
  2. 联想lenovo Z470笔记本的驱动安装
  3. 【安全】免密登陆SQLSERVER 之 Token 窃取
  4. 理解 Python 中的 *args 和 **kwargs
  5. python 中main函数总结
  6. 多线程的那点事儿(之数据互斥)
  7. Python使用scipy进行多项式计算与符号计算
  8. 通过url判断当前页,动态给导航加样式
  9. java作用域对象笔记_Java学习笔记(七)——对象
  10. 人类首张黑洞照片发布,像甜圈圈,顺便恭喜爱因斯坦
  11. Security+ 学习笔记14 对称密码学
  12. 统计php 代码行数,PHP实现统计代码行数小工具
  13. JAVA 连接sftp服务器,用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)
  14. Atitit.常见软件 数据 交换格式 标准
  15. 台式机电源选购资料调研+为什么50%的时候负载功率最大+80PLUS的解释
  16. 苹果APP Store应用上架流程
  17. ARM base instruction -- orr
  18. 【会议预告】第七届上海国际皮革展览会
  19. 有文化的人吟了一句诗
  20. 设计模式----单利模式

热门文章

  1. 自定义console.log字体样式
  2. js的hasOwnProperty
  3. 大量原创视频教程分享(01)---XSL语法教程
  4. [置顶]架构设计之性能设计经验
  5. dojo/dom-class源码学习
  6. Quartz的misfire特性
  7. WCF-006:服务端类的封装问题
  8. 应用程序平台应用之星:在线手机应用开发平台 不用搭建环境
  9. 59. web 攻击技术(3)
  10. 61. Catalog 分类页面商品排序