JSP&Servlet(3)——使用数据库验证登录页面的登录

运行如下:

数据库是使用的MySQL

其建表语句如下:

create database login;
use login;
create table users
(
  id       int primary key auto_increment not null,
  username varchar(50) unique             not null,
  password varchar(50) not null
);
insert into login.users(username, password) values ('hello','world');

在本项目中是使用的maven管理,所以需要的几个依赖如下:

        <!--连接数据库的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <!--使用单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

注:如果不适应maven请自行添加第三方加包:mysql-connector-java.jar和junit.jar包。

项目结构如下:

首选是index.jsp的内容:

<%@ page import="java.net.URLDecoder" %>
<%--加载静态JSP页面需设置该页的编码格式为UTF-8--%>
<%@ page pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>登录</title>
    <link rel="stylesheet" href="css/basic.css">
</head>
<body>
<div>
    <%
        // 用户名
        String user = "";
        // 登录密码
        String pass = "";
        // 复选框是否选中
        String checked = "";
        // 获取的是请求里的所有cookie组成的数组
        Cookie[] cookies = request.getCookies();
        // 如果cookies数组不为空对其进行遍历
        if (cookies != null && cookies.length > 0) {
            // 循环遍历Cookie
            for (int i = 0; i < cookies.length; i++) {
                // 获取Cookie对象
                Cookie cookie = cookies[i];
                // 将创建的cookie名与获取的cookie数组中已经存在的cookie名进行比较
                if ("name".equals(cookie.getName())) {
                    // "name"是在另一个jsp文件中创建的cookie名
                    // 获取名字叫做"name"的cookie的值
                    user = URLDecoder.decode(cookie.getValue(), "utf-8");
                    // 将“记住我”设置为勾选
                    checked = "checked";
                }
                // 将创建的cookie名与获取的cookie数组中已经存在的cookie名进行比较
                if ("password".equals(cookie.getName())) {
                    // "password"是在另一个jsp文件中创建的cookie名
                    // 获取名字叫做"password"的cookie的值
                    pass = cookie.getValue();
                }
            }
        }
    %>
    <h1>用户登录</h1>
    <form action="loginServlet" method="POST">
        <%--<%=user%>指的是将获取的cookie值放进输入框内--%>
        <img src="img/login.png"><input type="text" name="username" value="<%=user%>"/><br/><br/>
        <img src="img/password.png"><input type="password" name="password" value="<%=pass%>"/><br/><br/>
        <input type="checkbox" name="rememberme" checked="<%=checked%>"/>记住我
        &nbsp;&nbsp;&nbsp;&nbsp;
        <input type="submit" name="login" value="登录"/>
    </form>
</div>
</body>
</html>

接着是登录成功的succes.jsp文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
    <h1>恭喜你,登录成功!</h1>
</body>
</html>

和登录失败跳转的error.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h1 style="color: red">Error:<%=session.getAttribute("error")%></h1>
</body>
</html>

先创建一个实体类User.java

package bean;

/**
 * @author lck100
 */
public class User {
    private int id;// 用户编号
    private String username; // 用户名
    private String password; // 登录密码

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

接着是创建一个数据库连接方法类JDBCUtils.java

package utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author lck100
 */
public class JDBCUtils {

    /**
     * 获取数据库连接
     *
     * @return 返回数据库连接对象
     */
    public static Connection getConnection() {
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 数据库连接
            String url = "jdbc:mysql://localhost:3306/login";
            // 用户名
            String user = "root";
            // 数据库登录密码
            String password = "admin";
            // 获取数据库连接对象
            Connection connection = DriverManager.getConnection(url, user, password);
            // 返回数据库连接对象
            return connection;
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

准备工作做好之后,可以创建处理数据库数据的方法了UserDao.java

package dao;

import bean.User;
import utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
    /**
     * 通过用户名获取用户信息
     *
     * @param username 用户名
     * @return 返回用户对象
     */
    public User checkUserByName(String username) {
        try {
            // 声明User对象
            User user = null;
            // 获取数据库连接对象
            Connection connection = JDBCUtils.getConnection();
            // 数据库语句
            String sql = "select id,username,password from users where username=?";
            // 创建数据库执行对象
            PreparedStatement ps = connection.prepareStatement(sql);
            // 设置参数
            ps.setString(1, username);
            // 执行查询获取查询结果集
            ResultSet resultSet = ps.executeQuery();
            // 循环结果集
            while (resultSet.next()) {
                // 实例化User对象
                user = new User();
                // 设置用户的id
                user.setId(resultSet.getInt(1));
                // 设置用户的名字
                user.setUsername(resultSet.getString(2));
                // 设置用户的密码
                user.setPassword(resultSet.getString(3));
            }
            // 返回获得的User对象
            return user;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

方法写好后就是测试该方法,在test/dao目录下创建一个UserDaoTest.java类进行测试:

package dao;

import bean.User;
import org.junit.Test;

public class UserDaoTest {
    private UserDao userDao=new UserDao();

    /**
     * 测试通过用户名查询用户
     */
    @Test
    public void testCheckUserByName(){
        User user = userDao.checkUserByName("hello");
        System.out.println(user);
    }
}

注意:在这个测试方法中使用了@Test注解,需要导入junit包,如果你不需要使用这种方法测试(可以使用main方法进行测试)就不需要导入junit包。

测试成功后表示成功在数据库查询到数据,那么可以在LoginServlet.java中使用了。

LoginServlet.java代码如下:

package servlet;

import bean.User;
import dao.UserDao;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * @author lck100
 */
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求的Session
        HttpSession session = request.getSession();
        // 获取输入用户名文本框的值
        String username = request.getParameter("username");
        // 获取输入密码的密码框的值
        String password = request.getParameter("password");
        // 获取通过从前端得到的用户名在数据库查到的用户对象
        User user = new UserDao().checkUserByName(username);
        // 这里进行验证是通过和数据库中的数据进行比较匹配的
        if (user != null && username.equals(user.getUsername()) && password.equals(user.getPassword())) {// 如果用户名和密码都正确
            // 新建名为name的Cookie
            Cookie nameCookie = new Cookie("name", URLEncoder.encode(username, "utf-8"));
            // 新建名为password的Cookie
            Cookie passwordCookie = new Cookie("password", password);

            // 设置Cookie的使用路径
            nameCookie.setPath(request.getContextPath() + "/");
            passwordCookie.setPath(request.getContextPath() + "/");

            // 获取是否保存Cookie
            String rememberme = request.getParameter("rememberme");
            // 判断复选框是否被选中,如果选中则返回on,如果没有被选中就会返回null,所以需要注意
            if (rememberme != null && rememberme.equals("on")) {
                // 设置保存Cookie的时间长度,单位为秒
                nameCookie.setMaxAge(7 * 24 * 60 * 60);
                passwordCookie.setMaxAge(7 * 24 * 60 * 60);
            } else if (rememberme == null) {
                // 设置将不保存Cookie
                nameCookie.setMaxAge(0);
                passwordCookie.setMaxAge(0);
            }

            // 输出到客户端
            response.addCookie(nameCookie);
            response.addCookie(passwordCookie);

            // 登录成功后跳转到success.jsp
            request.getRequestDispatcher("success.jsp").forward(request, response);
        } else if (user != null && !username.equals(user.getUsername()) && password.equals(user.getPassword())) {// 如果用户名不正确,密码正确
            // 保存错误提示数据
            session.setAttribute("error", "用户名不正确");
            // 登录失败后将跳转到error.jsp
            request.getRequestDispatcher("error.jsp").forward(request, response);
        } else if (user != null && username.equals(user.getUsername()) && !password.equals(user.getPassword())) {// 如果用户名正确,密码不正确
            // 保存错误提示数据
            session.setAttribute("error", "密码不正确");
            // 登录失败后将跳转到error.jsp
            request.getRequestDispatcher("error.jsp").forward(request, response);
        } else if (user == null) {// 如果没有查询到数据
            // 保存错误提示数据
            session.setAttribute("error", "该用户不存在");
            // 登录失败后将跳转到error.jsp
            request.getRequestDispatcher("error.jsp").forward(request, response);
        } else {// 如果用户名和密码都不正确
            // 保存错误提示数据
            session.setAttribute("error", "用户名和密码都不正确");
            // 登录失败后将跳转到error.jsp
            request.getRequestDispatcher("error.jsp").forward(request, response);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

登录成功。

如果对完整源码有兴趣。

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【CSDN201909260940】可获取本节源码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值