嗨,费了好大功夫终于想到asp用户登陆后自动返回到登陆前面的方法了。
在网上查资料时,有说用session 或cookies记录下每个页面的ID然后登陆后转向调用就行了,在下认为这难免有些小题大作,而且操作起来有些麻烦(不会写),所以就没有用这种方法;还有说用document.referrer的,然而这只能是返回前一页面,而非登陆前一页面,用样也有说用request.server("http_referer")方法实现的,而它也只是转向前一页面。后来看到有说用表单隐藏域在登陆页面记录下登陆前页面,然后再在登陆处理页面获取该隐藏域值后用javascript中的window.location转向就行了,在下javascript编程能力比较差,于是用最笨的办法试了下:
登陆前页面:a.asp,其内容简化为:
if session("user")="" then
<script language=javascritp>window.location="login.asp"</script>
end if
然后在登陆页面表单中加上:
<input type="hidden" name="c" value="/blog/<%=request.ServerVariables("HTTP_REFERER")% >
再在登陆check页面用request.form("c")
check.asp页面简化为:
<form action="" method="post" name="myform"><input name="referrer" type="hidden" value="/blog/<%=request.Form("referrer")%>" /></form>
<script language="javascript" >
<!--此函数和上面表单隐藏域及下面一句ASP调用供弹出添加成功对话框后转向相应之用,主要为传递referrer栏目中value值
function pass()
{
var c;
alert("恭喜!\n\n登陆成功!");
c=document.myform.referrer.value
window.location=c;
}
//-->
</script>
<%Response.Write("<script>pass()</script>")%>
这样看起来似乎可以,a.asp页面转到login.asp后,a.asp页面地址信息被<%=request.ServerVariables("HTTP_REFERER")% >放到隐藏域中被传到check.asp页面后被利用来作页面转向,分析倒没错,可惜试了好几次都没成功,把a.asp中转向代码换成<%response.redirect("login.asp")%>还是没用,把login.asp中换成用document.referrer用javascript赋给隐藏域后再传到check.asp页面也还是不行,调试时发现以上处理都有一个共同的错误:check.asp页面某一处缺少对象,察看解析出的html发现就是最后一个页面的value值其实为空,其实是没能获得前面页面的值。
分析一下,login.asp到check.asp页面问用表单传值是不会有问题的,那问题应该是出在a.asp到login.asp页面间了,也就是说不管是request.ServerVariables("HTTP_REFERER")还是document.referrer都没用获得a.asp页面的地址,那究竟是什么原因呢?
查了一下,才知道,这两种方法在下列情况下都是无法获得前一页面的地址的:
1.从收藏夹链接
2.单击'主页'或者自定义的地址
3.利用Jscript的location.href or location.replace()
4.在浏览器直接输入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>转向
7.用XML加载地址
这才知道,试了半天原来是犯了大忌,做了半天无用功。那么看来上面的自动转向方法都不能用了,于是问题又集中在自动转向的方法上。
又找了好久看到下列情况,上面两种方法可以获取前页面地址信息:
1.直接用<a href>
2.用Submit或<input type=image>提交的表单(POST or GET)
3.使用Jscript提交的表单(POST or GET)
这下有救了,用javascript把表单自动提交那就行了。于是问题终于解决了。
详细方法:
--------a.asp页面----------:
<%if trim(session("user"))="" or trim(session("pass"))="" then%>
<form name="submit_form" action="../user/login.asp" method="get"></form>
<script language="javascript">
document.submit_form.submit()</script>
<%response.end()%>
<%else%>
其它登陆后才能显示的内容
<%end if %>
--------login.asp页面---------:
<form action="check.asp" name="myform" method="post">
<input type="hidden" name="c" value="/blog/<%=request.ServerVariables("HTTP_REFERER")% >
其它登陆文本框<input>
</form>
--------check.asp页面---------:
<input type="hidden" name="c" value="/blog/<%=request.ServerVariables("HTTP_REFERER")% >
再在登陆check页面用request.form("c")
check.asp页面简化为:
<form action="" method="post" name="myform"><input name="referrer" type="hidden" value="/blog/<%=request.Form("referrer")%>" /></form>
<script language="javascript" >
<!--此函数和上面表单隐藏域及下面一句ASP调用供弹出添加成功对话框后转向相应之用,主要为传递referrer栏目中value值
function pass()
{
var c;
alert("恭喜!\n\n登陆成功!");
c=document.myform.referrer.value
window.location=c;
}
//-->
</script>
这样麻烦点,但代码好懂,所以在下也省得花心思想更地道的方法了。不过,不知道把login和check写在一个页面后直接用document.referrer或request.ServerVariables("HTTP_REFERER")行不行,没用试,不过我想应该不行,因为虽然是一个页面但提交一次后是自身转向自身,最后一次执行的前一页面是本身,还是不是登陆前页面,所以估且用上面的笨方法了。
嗨,费了好长时间,张于把这个问题解决了!