【发布时间】:2012-02-02 00:08:29
【问题描述】:
我有一个登录表单 (login.jsp),其中包含两个输入字段,用户名和密码。
我通过 Ajax 使用 POST 来访问登录 servlet。
我希望用户登录,如果登录成功,则重定向到另一个名为“search.jsp”的页面。如果不成功,“登录失败”消息将作为 Ajax responseText 返回,以插入到“login.jsp”页面的段落中。
一切正常,我的登录 servlet 通过一个单独的 bean 访问数据库,并返回了该 bean 的一个对象,其属性可供使用。所以一切都很好。
但是,在用户名和密码通过数据库验证后,我使用 RequestDispatcher 转发到新的登录页面 (search.jsp)。
这是我的 doPost()
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username,password;
username = request.getParameter("p");
password = request.getParameter("q");
try {
LoginService ls = new LoginService(username,password);
User user = ls.getUserDetails();
if(user.getUsername()!=null && user.getPassword()!=null){
FormService filler = new FormService();
Form fields = filler.getFields();
request.setAttribute("user",user);
request.setAttribute("fields1",fields);
request.setAttribute("fields2",fields);
request.setAttribute("fields3",fields);
HttpSession session = request.getSession(true);
//set attribute for the session
session.setAttribute("user",user.getUsername());
//Now, the RequestDispatcher.forward() is not forwarding to the new page!
//The whole 'search.jsp' page is being stuffed back into the 'login.jsp' page
RequestDispatcher rd = request.getRequestDispatcher("search.jsp");
rd.forward(request,response);
return;
}
else{
PrintWriter out = response.getWriter();
out.println("login failed!");
return;
}
} catch (Exception e) {
e.printStackTrace();
}
}
但不是将请求和响应转发到新的 jsp 页面“search.jsp”,而是将整个 search.jsp 页面塞回原来的 login.jsp 页面 - 在包含 Ajax responseText 的 html 元素中在登录失败时。
servlet 中的 forward() 方法在从表单操作属性调用 servlet 时起作用,但在调用包含 Ajax 代码的 javascript 文件时不起作用。
【问题讨论】:
-
既然您进行了 AJAX 调用来进行登录,您应该返回 out.println("login success!");当它成功时。收到响应后,使用条件 javascript 更改页面位置或仅显示失败消息。
-
ricz 我不确定你的意思 - 我认为当用户被重定向到新页面时应该暗示成功登录 - 这是我无法开始工作的重定向.
-
AJAX 调用接收响应并将 responseText 放在您告诉它放置的位置。如果你想改变浏览器页面的位置,那么使用javascript来改变它。