这是在一次工作经历中遇到的问题。
首先在Page_Load中添加了一些用来判断用户是否登录的代码,如果没有登录,则提示信息“请先登录”,并跳转到登陆页面;
首次代码如下:
首次代码如下:
- HttpCookie cookie = Request.Cookies["userId"];
- if (Request.Cookies["userId"] != null)
- {
- txtId.Text = cookie["userName"];
- }
- else
- {
- Response.Write("<script> alert('请先登录!');</script>");
- Response.Redirect("~/Login.aspx");
-
- }
这样的代码,貌似没什么问题;但是实际上却存在很大的缺陷;即“请先登录!”不会出现。修改了下
第二次代码如下:
- int temp = 0;
- HttpCookie cookie = Request.Cookies["userId"];
- if (Request.Cookies["userId"] != null)
- {
- txtId.Text = cookie["userName"];
- }
- else
- {
- Response.Write("<script> alert('请先登录!');</script>");
- temp = 1;
- }
- if (temp == 1)
- {
- Response.Redirect("~/Login.aspx");
- }
想通过这样来显示提示信息之后再跳转页面;但是不起到任何作用
后来在敲Response.Redirect()时发现有两个方法可以重载:(string url)及(string url,bool endResponse)这里我们经常使用的是前一种;稍作修改
后来在敲Response.Redirect()时发现有两个方法可以重载:(string url)及(string url,bool endResponse)这里我们经常使用的是前一种;稍作修改
第三次代码如下:
- int temp = 0;
- HttpCookie cookie = Request.Cookies["userId"];
- if (Request.Cookies["userId"] != null)
- {
- txtId.Text = cookie["userName"];
- }
- else
- {
- Response.Write("<script> alert('请先登录!');</script>");
- temp = 1;
- Response.Redirect("~/Login.aspx", true);
- }
- if (temp == 1)
- {
- Response.Redirect("~/index.aspx");
- }
上面代码执行的结果还是没有提示信息,直接跳转到Login.aspx页面;而对将代码中的 Response.Redirect("~/Login.aspx", true); 修改为Response.Redirect("~/Login.aspx", false);时,结果就变成跳转到index.aspx页面了,研究后发现bool类型的值决定了页面是否终止执行;这个具体的可以通过断点调试看出具体的执行效果;稍作修改
第四次代码如下:
- int temp = 0;
- HttpCookie cookie = Request.Cookies["userId"];
- if (Request.Cookies["userId"] != null)
- {
- txtId.Text = cookie["userName"];
- }
- else
- {
- temp = 1;
- Response.Redirect("~/Login.aspx", false );
- }
- if (temp == 1)
- {
- Response.Write("<script> alert('请先登录!');</script>");
- //Response.Redirect("~/index.aspx");
- }
但是即便是如此也还是没能显示提示用户登录的信息;
最终总结3点揭开Response.Redirect();方法的面纱:
1:Response.Redirect();其实在内部执行了方法 Response.End();
原因是Response.End ()方法停止页的执行,并将该执行变换到应用程序的事件中的 Application_EndRequest 事件。故而Response.End 后面的代码行将不执行。
不妨 可以把else部分的代码修改一下,即可看出效果
Response.Write("<script> alert('请先登录!');</script>");
Response.End();
Response.Redirect("~/Login.aspx");
这时提示信息“请先登录”弹出,但并没有跳转到Login.aspx页面;
2:当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代码302(表示目标已经改变)以及新的目标URL。浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求。这就是说,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面
的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面;
3:如果使用try{ Response.Redirect("......");}catch{.....}的话,则应设置Response.Redirect("......",false); 因为使用重载 Response.Redirect(String url, bool endResponse),对 endResponse 参数它传递 false可以取消对 Response.End 的内部调用;
其实达到显示提示信息“请先登录”,并跳转到登陆页面的代码非常简短。
如下所示:
最终总结3点揭开Response.Redirect();方法的面纱:
1:Response.Redirect();其实在内部执行了方法 Response.End();
原因是Response.End ()方法停止页的执行,并将该执行变换到应用程序的事件中的 Application_EndRequest 事件。故而Response.End 后面的代码行将不执行。
不妨 可以把else部分的代码修改一下,即可看出效果
Response.Write("<script> alert('请先登录!');</script>");
Response.End();
Response.Redirect("~/Login.aspx");
这时提示信息“请先登录”弹出,但并没有跳转到Login.aspx页面;
2:当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代码302(表示目标已经改变)以及新的目标URL。浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求。这就是说,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面
的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面;
3:如果使用try{ Response.Redirect("......");}catch{.....}的话,则应设置Response.Redirect("......",false); 因为使用重载 Response.Redirect(String url, bool endResponse),对 endResponse 参数它传递 false可以取消对 Response.End 的内部调用;
其实达到显示提示信息“请先登录”,并跳转到登陆页面的代码非常简短。
如下所示:
- HttpCookie cookie = Request.Cookies["userId"];
- if (Request.Cookies["userId"] != null)
- {
- txtId.Text = cookie["userName"];
- }
- else
- {
- Response.Write("<script> alert('请先登录!');location.replace('Login.aspx');</script>");
- }