用户未登录或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' && ...
随机推荐
- HDFS基本Shell命令
bin目录下: 1. hadoop fs 基本操作命令,类似linux shell 2. hadoop dfsadmin 管理命令 3. hadoop fsck (1. 检查hdfs中文件的健康 ...
- mybatis一级缓存
在select 处添加useCache=false flushCache=true, mybatis默认开启一级缓存
- [工作积累] TAA Ghosting 的相关问题
因为TAA要使用上一帧的历史结果,那么在相机移动的时候,颜色就会有残留,出现ghosting(残影). 由于上一帧历史是累积的,是由上一帧的直接渲染结果和上上帧的结果做了合并,所以ghosting并不 ...
- bond模式
1.mode=0(balance-rr)(平衡抡循环策略) 链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路.交换机需要配置聚合口,思科叫port channel.特点:传输数据包顺序 ...
- Python图片裁剪
我们使用的是Image中的crop(box)功能,它需要一个参数box,元组 类型,元组包括4个元素,如:(距离图片左边界距离x, 距离图片上边界距离y,距离图片左边界距离+裁剪框宽度x+w,距离图片 ...
- 详解java定时任务---Timer篇
一.简介 在java的jdk中提供了Timer.TimerTask两个类来做定时任务. Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子 ...
- 在虚拟机上配置安装hadoop集群
原本以为有大神已经总结的很清楚了,就不自己在写了, 但是在自己安装的过程中还是出现了一些问题, 所以打算以自己的方式重新总结一下. 参考https://blog.csdn.net/hliq539 ...
- 【java】之算法复杂度o(1), o(n), o(logn), o(nlogn)
在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...
- Scrapy实战篇(七)之爬取爱基金网站基金业绩数据
本篇我们以scrapy+selelum的方式来爬取爱基金网站(http://fund.10jqka.com.cn/datacenter/jz/)的基金业绩数据. 思路:我们以http://fund.1 ...
- python 中增加css样式的三种方式
增加css样式的三种方式: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...