在本教程中,我将指导您如何使用 Servlet、JSP、JDBC 和 MySQL 为小型 Java Web 应用程序实现登录和注销功能。只是简单的旧的核心 Java EE 技术。没有使用任何框架。
假设您有一个现有的 Java Web 项目,现在您希望为您的网站添加登录和注销功能。
表中的内容:
1.创建用于认证的数据库表
在登录页面中,用户输入电子邮件和密码——因此我们需要根据数据库表(通常是用户表)中的数据验证登录信息。
确保您用于身份验证的表至少有 3 个字段:fullname、email和password。
这是我在本教程中使用的表 users 的结构:
如果您还没有创建任何用于身份验证的表,请执行以下 MySQL 脚本来创建一个:
1
2
3
4
5
6
7
|
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
`fullname` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
|
当然,如果需要,您可以向此表添加其他字段。
2. User 模型类
接下来,创建一个代表用户的普通旧 Java 对象 (POJO) 类:
1
2
3
4
5
6
7
8
9
10
11
|
package net.codejava;
public class User {
private int id;
private String fullname;
private String email;
private String password;
// getters and setters are not shown for brevity
}
|
您应该为此类的所有字段生成 getter 和 setter 方法。它们没有在上面的代码或简洁中显示。
3. 验证码登录方式
接下来,我们需要实现一个方法,将用户输入的登录信息与数据库中的数据进行对比。因此,使用以下代码创建 UserDAO 类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package net.codejava;
import java.sql.*;
public class UserDAO {
public User checkLogin(String email, String password) throws SQLException,
ClassNotFoundException {
String jdbcURL = "jdbc:mysql://localhost:3306/bookshop" ;
String dbUser = "root" ;
String dbPassword = "password" ;
Class.forName( "com.mysql.jdbc.Driver" );
Connection connection = DriverManager.getConnection(jdbcURL, dbUser, dbPassword);
String sql = "SELECT * FROM users WHERE email = ? and password = ?" ;
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString( 1 , email);
statement.setString( 2 , password);
ResultSet result = statement.executeQuery();
User user = null ;
if (result.next()) {
user = new User();
user.setFullname(result.getString( "fullname" ));
user.setEmail(email);
}
connection.close();
return user;
}
}
|
请注意,在checkLogin()方法的开头指定的数据库连接信息。您应该根据您计算机上的 MySQL 更新 JDBC URL、用户名和密码。
如果在数据库中找到电子邮件和密码,您可以看到checkLogin()方法返回非空用户对象。否则返回null。
要了解有关 Java 数据库编程的更多信息,请阅读此 JDBC 教程。
4.代码登录页面
使用以下代码为登录页面 ( login.jsp ) 编写代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
< html >
< head >
< meta charset = "utf-8" >
< title >Bookshop Website</ title >
</ head >
< body >
< div style = "text-align: center" >
< h1 >Admin Login</ h1 >
< form action = "login" method = "post" >
< label for = "email" >Email:</ label >
< input name = "email" size = "30" />
< br >< br >
< label for = "password" >Password:</ label >
< input type = "password" name = "password" size = "30" />
< br >${message}
< br >< br >
< button type = "submit" >Login</ button >
</ form >
</ div >
</ body >
</ html >
|
运行时,此登录页面如下所示:
请注意,在login.jsp页面中,我们使用 EL 表达式${message}来显示从服务器发送的消息——通常是为了告诉用户登录失败。
如果要在提交表单之前验证表单中的字段,请在页面的<head>部分中添加以下脚本标签:
1
2
3
4
5
6
|
< script
src = "https://code.jquery.com/jquery-3.4.1.min.js"
integrity = "sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin = "anonymous" ></ script >
< script type = "text/javascript"
src = "https://cdn.jsdelivr.net/npm/jquery-validation@1.19.0/dist/jquery.validate.min.js" ></ script >
|
这里我们使用来自 CDN 网站的 2 个 jQuery 库(核心库和验证库)。
并在结束</html>标记之前添加以下 jQuery 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< script type = "text/javascript" >
$(document).ready(function() {
$("#loginForm").validate({
rules: {
email: {
required: true,
email: true
},
password: "required",
},
messages: {
email: {
required: "Please enter email",
email: "Please enter a valid email address"
},
password: "Please enter password"
}
});
});
</ script >
|
此脚本验证电子邮件和密码字段不为空,并且用户必须输入有效的电子邮件地址。您可以使用纯 Javascript 来验证表单的字段,但使用 jQuery 更方便。
5.代码登录Servlet类
在服务器端,创建一个 Java servlet 类来处理上面登录表单的提交。这是代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package net.codejava;
import java.io.*;
import java.sql.SQLException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet ( "/login" )
public class UserLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UserLoginServlet() {
super ();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String email = request.getParameter( "email" );
String password = request.getParameter( "password" );
UserDAO userDao = new UserDAO();
try {
User user = userDao.checkLogin(email, password);
String destPage = "login.jsp" ;
if (user != null ) {
HttpSession session = request.getSession();
session.setAttribute( "user" , user);
destPage = "home.jsp" ;
} else {
String message = "Invalid email/password" ;
request.setAttribute( "message" , message);
}
RequestDispatcher dispatcher = request.getRequestDispatcher(destPage);
dispatcher.forward(request, response);
} catch (SQLException | ClassNotFoundException ex) {
throw new ServletException(ex);
}
}
}
|
如您所见,doPost()方法处理来自客户端的登录请求。它调用UserDAO类的checkLogin()方法来根据数据库验证电子邮件和密码。
如果登录成功,它会在会话中设置一个属性来存储有关登录用户的信息,并将请求转发到管理主页:
1
2
3
4
5
|
if (user != null ) {
HttpSession session = request.getSession();
session.setAttribute( "user" , user);
destPage = "home.jsp" ;
}
|
要了解有关 Java 会话处理的更多信息,请阅读此Java 会话教程。
如果登录失败,则在请求中将错误消息设置为属性,并再次转发到登录页面:
1
2
3
4
|
} else {
String message = "Invalid email/password" ;
request.setAttribute( "message" , message);
}
|
您可以在此处了解有关 Java servlet 重定向的更多信息。
home.jsp页面的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
< html >
< head >
< meta charset = "utf-8" >
< title >Admin CPanel - Bookshop</ title >
</ head >
< body >
< div style = "text-align: center" >
< h1 >Welcome to Bookshop Website Admin Panel</ h1 >
< b >${user.fullname} (${user.email})</ b >
< br >< br >
< a href = "logout" >Logout</ a >
</ div >
</ body >
</ html >
|
请注意,我们使用 EL 表达式${user.fullname} 显示全名,使用${user.email}显示登录用户的电子邮件。并且有一个注销链接,允许用户从网站注销。
通过阅读这篇EL 运算符摘要文章,您可以了解有关 JSP 中的 EL 运算符的更多信息。
6.代码注销Servlet类
要实现注销功能,请创建一个 Java servlet 类来处理来自客户端的注销请求,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package net.codejava;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet ( "/logout" )
public class UserLogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UserLogoutServlet() {
super ();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession( false );
if (session != null ) {
session.removeAttribute( "user" );
RequestDispatcher dispatcher = request.getRequestDispatcher( "login.jsp" );
dispatcher.forward(request, response);
}
}
}
|
如您所见,我们检查会话是否存在,删除登录功能中设置的属性用户 ,并将请求转发到登录页面。
7. 测试登录和注销功能
您可以在本教程末尾的附件部分下载示例项目进行运行和测试。假设我们在表users中有以下数据:
访问显示以下屏幕的登录页面:
尝试输入无效的电子邮件和空白密码,您将看到验证错误消息如下所示:
现在让我们输入正确的电子邮件和密码,然后单击Login,您将看到管理员主页如下所示:
您可以看到登录用户的全名和电子邮件显示在此页面上。
单击注销链接,您将看到它重定向到登录页面。
这就是如何使用 Java Servlet、JSP、JDBC 和 MySQL 实现 Java Web 应用程序的登录和注销功能。它非常简单,因此您可以轻松地添加到现有的小项目中,而无需使用任何框架。
但是,要完全保护需要登录的网站页面,您需要实施身份验证过滤器。