客户端跳转vs服务器端跳转以及登录验证

一.概述

在学生信息管理系统的登录模块中,用到了简单的登录验证:若账号密码不正确,则返回登录页面;若有未登录用户直接访问了主界面或者其他页面,也需要返回到登录页面。这就涉及到了客户端跳转与服务器端跳转。

二.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();
            }
        }
    }
}

四.分析

  1. 在loginservlet中,获取到传来的参数后,先验证是否为空,若为空,则在request中设置属性error,再使用request.getRequestDispatcher(“index.jsp”).forward(request, response),服务器将将请求转发到index.jsp,index.jsp中有${error }会将错误信息显示。
  2. 若验证通过,LoginServlet就会通request.sendRedirect(“main.jsp”)重定向到main.jsp.request是新的request了。
  3. 还有一个比较重要的,就是session的设置,在验证成功后,利用 session.setAttribute(“currentUser”,currentUser),在session中设置当前用户,然后再跳转到main.jsp。这样若没有登录,currentUser就是空值。

你可能感兴趣的:(java-ee)