运行如下:
数据库是使用的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管理,所以需要的几个依赖如下:
mysql
mysql-connector-java
5.1.38
junit
junit
4.12
注:如果不适应maven请自行添加第三方加包:mysql-connector-java.jar和junit.jar包。
项目结构如下:
首选是index.jsp的内容:
<%@ page import="java.net.URLDecoder" %>
<%--加载静态JSP页面需设置该页的编码格式为UTF-8--%>
<%@ page pageEncoding="utf-8" %>
登录
<%
// 用户名
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();
}
}
}
%>
用户登录
接着是登录成功的succes.jsp文件:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录成功
恭喜你,登录成功!
和登录失败跳转的error.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Error
Error:<%=session.getAttribute("error")%>
先创建一个实体类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】可获取本节源码。