在写验证用户的时候,我敲入了如下一段代码:
while (rs.next()) {
if (rs.getString(1).equals(password)) {
// 验证成功,转向欢迎界面
request.setAttribute("pass", "true");
// response.sendRedirect("Welcome");
request.getRequestDispatcher("Welcome").forward(request,
response);
}
}
response.sendRedirect("Login");
忽然想起老师说过一句话,Servlet在跳转过后,仍会执行后面的代码!
按这种说法,浏览器在第一次请求且验证成功后,被转发到 Welcome Servlet,之后代码继续执行,应该会被重定向到 Login 页面!!
可是,这段代码实现了验证功能,且浏览器并没有报错。感到很是奇怪!
于是我分别在重定向语句的前后加入一个语句进行验证,如下:
while (rs.next()) {
if (rs.getString(1).equals(password)) {
// 验证成功,转向欢迎界面
request.setAttribute("pass", "true");
// response.sendRedirect("Welcome");
request.getRequestDispatcher("Welcome").forward(request,
response);
}
}
System.out.println("111");
response.sendRedirect("Login");
System.out.println("222");
再次访问,当验证失败时,页面被重定向到 Login 页面,且后台打印:111和222,说明,老师的话是正确的!
当验证成功时,页面转发到 Welcome Servlet,且后台打印:111,到 sendRedirect() 就停止了!!
为了看看是否进入 sendRedirect 我加入这样一句:response.sendRedirect("Login?back=true");并在Login页面接收参数后台打印。访问验证,后台没有打印出 true!也就是说在服务器转发过后,碰到重定向则停止运行!
那么问题又出来,finally 中的操作呢??那整个try之外呢,能否会被访问?
我在finally 中加入System.out.println("333"); 在try 语句外加入 System.out.println("444");
访问,当验证成功时,后台:111 和 333 (注意没有 444)
当验证失败时,后台:111和222和333和444和true
写到这里,我又用 HttpFox 测试了一下。当验证通过时,只发出过一个 Post 请求,当验证失败时 发出过一个 Post 和 Get 请求。
于时,结果就是,当在一个 Servlet 中被请求被转发过后,该 Servlet 还会继续执行,如果碰到重定向请求则不接受,之后的代码也不会被执行。
-----