用户未登录或Session超时时重定向到登录页,不那么简单
在网站开发中,我们经常有这样的场景出现:
情景1:对未登录的用户或没有权限的用户,当其想访问某个受限网页时,系统要能够自动转到登录页面.
情景2:对于用session保存用户状态的情况还有这样一种需求,当用户的session已超时时,用户再想执行操作时,也要将其转到登录页面.
在asp.net中,要实现上述的功能容易吗?有人会说:"这太容易了,可以通过下面两种方式实现".
方法一:直接调用asp.net中的response.redirect方法实现
response.redirect("login.aspx");方法二:通过asp.net调用js脚本来实现
response.write("<script>window.location='login.aspx';</script>");然而,真的这么简单吗?对于情景1,两种方法的确都可以实现.在网站的后台管理中,我们经常把管理功能放在一个框架集(或者用iframe来实现),左边是操作功能,右边是具体的操作页面.这时候,对于两种方法,都会出现是在左边或右边框架中打开login.aspx页,而不是我们想要的那种在顶层窗口中打开login.aspx页的情况.出现这种情况,第一种方法已经无能为力了,因为其只能在当前操作窗口中进行转向.对于第二种方法,有人说我可以修改一下就可以了嘛:
response.write("<script>window.parent.location='login.aspx';</script>");这样,就可以保证在父窗口中打开登录页了.不过,我们的代码要同时考虑到情景1和情景2的情况,在情景1中,上边那段代码会报错,因为其没有父窗口嘛.可能有人已经急不可待地说,这有什么难的,我再修改成下面这样不就可以了吗?
response.write("<script>window.top.location='login.aspx';</script>"); 看起来,对于情景1和情景2两种情况来说,这种写法已经可以解决这个问题了。但真的是这样吗?我们一般把判断用户是否登录放在page_load事件中,当用户未登录,没有权限或session超时时,就执行上面的代码,让其转到登录页.而在page_load事件中,我们还要经常做一些跟用户session相关的操作.举一个最简单的例子,当用户未登录或session超时时,我们将其转向登录页,当用户已经登录时,我们将用户的信息显示在页面中.这时如果我们调试程序,呈现session超时的情景(可以通过命令行下iisreset命令重启iis来模拟),就会发现出现异常.出现异常的原因是当执行response.write时程序会再次向服务器回传,触发page_load事件,这时session已丢失,所以写在page_load中的取session的代码会产生异常.
经过研究,我想出了解决办法:
那就是先使用response.redirect转向一个中间页,比如nologin.htm,再在这个中间页的onload事件中执行转向到登录页的javascript代码:
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title></title>
</head>
<script type="text/javascript">
function redirect()
{
window.top.location = "login.aspx";
}
</script>
<body onload="redirect();">
</body>
</html> 这样就能适应前面所说的所有场景了.
大家可能注意到了我这个html页面的<title></title>标记之间没有内容.为什么呢?如果有标题的话,你执行完转向之后,会在浏览器的"后退"按钮的下拉列表中看到对应的标题,也就是说用户会知道我们通过中间页进行了中转.如果没有标题的话,就看不我们中转的那个页,就和直接转到登录页一样.
通过这个问题的解决可以发现,多想一些,想全面一些对做程序有多么重要!
此文链接:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%8E%A8%E8%8D%90/20958.shtml
此文来自: 马开东博客 网址:http://www.makaidong.com
用户未登录或Session超时时重定向到登录页,不那么简单的更多相关文章
- 重写ajax方法实现请求session过期时跳转登录页面
jQuery(function($){ var _ajax=$.ajax; // 备份jquery的ajax方法 $.ajax=function(opt){ var _success = opt &a ...
- ajax前置处理实现异步请求session过期时跳转登录页面
第一篇博文,mark一下zhq[0]. 问题描述:用户页面,当session过期或都session注销后,普通页面后端都会有过滤器,session过期Redirect到登录页面,但是ajax请求后端只 ...
- 重写ajax方法实现异步请求session过期时跳转登录页面
jQuery(function($){ // 备份jquery的ajax方法 var _ajax=$.ajax; // 重写ajax方法, $.ajax=function(opt){ var _suc ...
- PHP设置会话(Session)超时过期时间实现登录时间限制[转]
用户登录系统60分钟后如果没有操作就自动退出 第一种方法即设置php.ini配置文件,设置session.gc_maxlifetime和session.cookie_lifetime节点属性值,当然也 ...
- PHP设置会话(Session)超时过期时间实现登录时间限制
最近某个PHP项目用到了限制登录时间的功能,比如用户登录系统60分钟后如果没有操作就自动退出,我搜索了网络收集了有以下方法可供参考. 第一种方法即设置php.ini配置文件,设置session.gc_ ...
- 重写ajax方法实现异步请求session过期时跳转登录页面(转)
一般我们会在过滤器里判断登录状态,如果没登录就跳转登录页面,过滤器java核心代码如下: UserItem loginUser = (UserItem)request.getSession().get ...
- struts2拦截器实现session超时返回登录页面(iframe下跳转到其父页面)
需求:session超时时,返回登录页面,由于页面嵌套在iframe下,因此要跳转到登录页面的父页面,但是首页,登录页面等不需要进行跳转 实现: java文件:SessionIterceptor.ja ...
- spring security:ajax请求的session超时处理
当前端在用ajax请求时,如果没有设置session超时时间并且做跳转到登录界面的处理,那么只是靠后台是很难完成超时的一系列动作的:但是如果后台 没有封装一个ajax请求公共类,那么在ajax请求上下 ...
- session过期时ajax请求刷新浏览器
ajax前置处理实现异步请求session过期时跳转登录页面 function checkLogin(json) { if (typeof(json) === 'string' && ...
随机推荐
- 491. Increasing Subsequences
这种increasing xxx 题真是老客户了.. 本题麻烦点在于不能重复, 但是和之前的那些 x sum的题目区别在于不能排序的 所以.... 我还是没搞定. 看了一个Java的思路是直接用set ...
- HNOI2006公路修建问题
https://www.luogu.org/problemnew/show/P2323 [题目描述] OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发 ...
- visual studio 2017 中默认无法开发 Android 8.0 及以上系统的解决方案
一般默认比较旧有两个原因,系统版本过旧,Visual Studio 版本过旧. 第一步,将windows 更新到最新版,必须是windows 10 并且更新到最新. 第二步,将visual studi ...
- 使用mediainfo工具统计每个视频文件(媒体文件)播放时长
需求 1.运营那边需要统计大量视频文件的播放时长,并汇总记录到excel表中,问我有什么方法搞定 这边搜索了很多统计媒体文件时长的,主要有以下几种 1.使用java获取 2.使用python获取 3. ...
- Bus Hound抓包分析,基于HID设备(原创)
Bus Hound数据分析: CTL:表示8字节的USB控制传输的Setup包----------------------------重点分析 控制传输setup(token包)和对应数据包(DATA ...
- cocos2dx lua invalid 'cobj' in function 'lua_cocos2dx'
解决方法 在创建 Node节点后 调用父节点 retain() 方法 手动增加引用 一般调用:clone()方法会出现,在变量后面加上对一个对应的retain() 方法
- HLS自习(1)
HLS自习(1) 处理器的处理方式:
- H3C IRF MAD检测原理及相关问题验证
一.IRF简介 IRF(Intelligent Resilient Framework,智能弹性架构)是H3C自主研发的软件虚拟化技术.它的核心思想是将多台设备通过IRF物理端口连接在一起,进行必要的 ...
- Reduce TIME_WAIT
see time wait number netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n vi /etc/sysctl.conf ...
- 转发 Delphi中线程类TThread 实现多线程编程
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...