一.概述
在学生信息管理系统的登录模块中,用到了简单的登录验证:若账号密码不正确,则返回登录页面;若有未登录用户直接访问了主界面或者其他页面,也需要返回到登录页面。这就涉及到了客户端跳转与服务器端跳转。
二.response.sendRedirect()与request.getRequestDispatcher().forward()区别
ps:以下内容转载自http://blog.csdn.net/u011415481/article/details/35276295
①response.sendRedirect(url)—–重定向到指定URL
request.getRequestDispatcher(url).forward(request,response) —–请求转发到指定URL
②response.sendRedirect(url)—–是客户端跳转
request.getRequestDispatcher(url).forward(request,response) —–是服务器端跳转
③response.sendRedirect(url)跳转到指定的URL地址后,上个页面(跳转之前的原来页面)中的请求全部结束,原request对象将会消亡,数据将会消失。紧接着,当前新页面会新建request对象,即产生新的request对象。
【详细过程:redirect 会首先发一个response给浏览器,然后浏览器收到这个response后再发一个request给服务器,服务器接收后发新的response给浏览器。这时页面从浏览器获取来的是一个新的request。这时,在原来跳转之前的页面用request.setAttribute存的东西都没了,如果在当前的新页面中用request.getAttribute取,得到的将会是null。】
request.getRequestDispatcher(url).forward(request,response)是采用请求转发方式,在跳转页面的时候是带着原来页面的request和response跳转的,request对象始终存在,不会重新创建。
【详细过程:forward 发生在服务器内部, 是在浏览器完全不知情的情况下发给了浏览器另外一个页面的response. 这时页面收到的request不是从浏览器直接发来的,可能是在转页时己经用request.setAttribute在request里放了数据,在转到的页面就可以直接用request.getAttribute获得数据了。】
④使用response.sendRedirect()地址栏中的网址将改变
使用request.getRequestDispatcher().forward(request,response)地址栏中的网址保持不变。
三.登录验证
LoginServlet.java
package com.sisheng.web;
import java.io.IOException;
import java.sql.Connection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.sisheng.dao.UserDao;
import com.sisheng.model.User;
import com.sisheng.util.DbUtil;
import com.sisheng.util.StringUtil;
public class LoginServlet extends HttpServlet{
DbUtil dbUtil = new DbUtil(); //数据库工具类
UserDao userUtil = new UserDao(); //用户数据操作类
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName=request.getParameter("userName"); //获取提交的userName
String password=request.getParameter("password"); //获取提交的password
request.setAttribute("userName", userName); //在请求中设置userName属性
request.setAttribute("password", password); //在请求中设置password属性
//判断为空
if(StringUtil.isEmpty(userName)||StringUtil.isEmpty(password)){
request.setAttribute("error", "账号或密码为空!"); //在请求中设置error属性,并赋值
request.getRequestDispatcher("index.jsp").forward(request, response);
return;
}
User user=new User(userName,password);
Connection con=null;
try {
con=dbUtil.getCon();
User currentUser=userUtil.login(con, user); //登录检查
if(currentUser==null){
request.setAttribute("error", "用户名或密码错误!");
// 服务器跳转
request.getRequestDispatcher("index.jsp").forward(request, response);
}else{
HttpSession session = request.getSession();
// 客户端跳转
response.sendRedirect("main.jsp");
session.setAttribute("currentUser",currentUser); //在session中设置用户
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con); //关闭数据库连接
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
四.分析
- 在loginservlet中,获取到传来的参数后,先验证是否为空,若为空,则在request中设置属性error,再使用request.getRequestDispatcher(“index.jsp”).forward(request, response),服务器将将请求转发到index.jsp,index.jsp中有
<td colspan="3"><font color="red">${error }</font></td>
会将错误信息显示。 - 若验证通过,LoginServlet就会通request.sendRedirect(“main.jsp”)重定向到main.jsp.request是新的request了。
- 还有一个比较重要的,就是session的设置,在验证成功后,利用 session.setAttribute(“currentUser”,currentUser),在session中设置当前用户,然后再跳转到main.jsp。这样若没有登录,currentUser就是空值。