下面来详细讲解“JavaWeb简单用户登录注册实例代码(有验证码)”的完整攻略。
1. 需求分析
在开始编写代码前,首先需要明确需求。这个JavaWeb实例主要实现以下功能:
- 用户注册:包括用户名、密码、确认密码以及验证码;
- 用户登录:包括用户名、密码以及验证码的校验;
- 验证码:生成随机数,用户填写后验证;
2. 技术栈
这个JavaWeb实例的技术栈主要包括:
- Tomcat:用于启动Web应用程序;
- Servlet:用于处理HTTP请求;
- JSP:用于向客户端呈现内容;
- JDBC:用于操作数据库(MySQL);
- Bootstrap:用于前端页面布局;
- jQuery:用于前端页面交互。
3. 实现步骤
下面我们将按照一般的JavaWeb实现流程,逐条实现上述功能。
(1)创建数据库
首先,需要创建一个名为“user”的数据库,该数据库包含两个表:user和captcha。其中user表用于存储用户的登录信息,captcha表用于存储验证码图片信息。
(2)实现验证码生成和验证
在JavaWeb中实现验证码一般有两种方法,一种是使用第三方库,另一种是自己编写。我们这里选择自己编写验证码。
在生成验证码图片时,要注意以下几点:(1)验证码可以是数字、字母、符号的组合;(2)验证码图片要设置字体、背景颜色、干扰线等方式,使验证码更难被机器识别。
在提交表单后,需要对用户输入的验证码进行校验,主要是验证用户的输入是否与生成的验证码一致。
(3)实现用户注册
用户注册时,需要向用户展示一个包含用户名、密码、确认密码和验证码的表单,用户填写完毕后提交表单。在提交表单后,需要对用户输入的数据进行验证,并将用户的信息存储到数据库中。
在验证用户输入数据时,要注意以下几点:(1)用户名不能重复;(2)密码和确认密码要一致;(3)验证码要正确。
(4)实现用户登录
用户在登录时,需要输入用户名、密码和验证码。在用户提交表单后,需要对输入的数据进行验证,确保用户名和密码一致,并且验证码正确。
若验证通过,则用户登录成功,否则登录失败。
4. 示例代码
下面的示例代码来自于GitHub上的一个JavaWeb项目,主要实现了用户登录、注册以及验证码生成和验证。具体实现过程和详细注释请见GitHub链接:https://github.com/Yuweh/javaweb_login_demo。
(1)生成验证码的示例代码:
@WebServlet("/captcha.jpg")
public class CaptchaServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final int WIDTH = 100;
private static final int HEIGHT = 30;
private static final int FONT_SIZE = 18;
private static final int LINE_NUM = 10;
private static final int POINT_NUM = 100;
private static final String CODES = "1234567890qwertyuiopasdfghjklzxcvbnm";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/jpeg");
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, WIDTH, HEIGHT);
graphics.setFont(new Font("Courier New", Font.BOLD, FONT_SIZE));
StringBuilder codeBuilder = new StringBuilder();
for (int i = 0; i < 4; i++) {
int randIndex = new Random().nextInt(CODES.length());
String rand = CODES.substring(randIndex, randIndex + 1);
codeBuilder.append(rand);
graphics.setColor(new Color(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));
graphics.drawString(rand, (i + 1) * 20, HEIGHT / 2 + FONT_SIZE / 2);
}
// 干扰线
for (int i = 0; i < LINE_NUM; i++) {
graphics.setColor(new Color(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));
graphics.drawLine(new Random().nextInt(WIDTH), new Random().nextInt(HEIGHT), new Random().nextInt(WIDTH), new Random().nextInt(HEIGHT));
}
// 干扰点
for (int i = 0; i < POINT_NUM; i++) {
graphics.setColor(new Color(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));
graphics.drawOval(new Random().nextInt(WIDTH), new Random().nextInt(HEIGHT), 1, 1);
}
request.getSession().setAttribute("captcha", codeBuilder.toString());
ImageIO.write(image, "jpeg", response.getOutputStream());
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
该示例代码实现了一个验证码生成器,生成的验证码图片包含四个随机字符,颜色随机并带有干扰线和干扰点。将生成的验证码值存储到Session中,供锁屏页面校验使用。
(2)实现用户注册的示例代码:
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8";
// 数据库用户名和密码自行修改
private static final String USER_NAME = "root";
private static final String PASSWORD = "root";
// 判断用户名是否重复,是返回true,否则返回false
private boolean isUserExist(String username) {
boolean flag = false;
try {
Class.forName(DRIVER_CLASS_NAME);
Connection conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
String sql = "select * from user where username=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
flag = true;
}
conn.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return flag;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String confirmPassword = request.getParameter("confirm_password");
String captcha = request.getParameter("captcha");
if (username == null || username.trim().isEmpty() || password == null || password.trim().isEmpty() || !password.equals(confirmPassword) || captcha == null || captcha.trim().isEmpty() || !captcha.equalsIgnoreCase((String) request.getSession().getAttribute("captcha"))) {
// 用户名或密码为空,或密码和确认密码不一致,或验证码为空,或验证码错误
response.sendRedirect("register.jsp");
} else if (isUserExist(username)) {
// 用户名已存在
response.sendRedirect("register.jsp?error=exist");
} else {
try {
Class.forName(DRIVER_CLASS_NAME);
Connection conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
String sql = "insert into user (username, password) values (?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ps.executeUpdate();
conn.close();
response.sendRedirect("login.jsp?username=" + username);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
response.sendRedirect("error.jsp");
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
该示例代码实现了用户注册逻辑。在接收到提交的表单数据后,首先判断用户名和密码是否为空以及密码与确认密码是否一致,验证码是否为空或是否正确。如果存在错误,则重定向到注册页面。如果用户名不存在,将用户名和密码存储到数据库中,并重定向到登录页面。
(3)实现用户登录的示例代码:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8";
// 数据库用户名和密码自行修改
private static final String USER_NAME = "root";
private static final String PASSWORD = "root";
// 校验用户名和密码是否正确,是返回true,否则返回false
private boolean checkUser(String username, String password) {
boolean flag = false;
try {
Class.forName(DRIVER_CLASS_NAME);
Connection conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
String sql = "select * from user where username=? and password=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
flag = true;
}
conn.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return flag;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String captcha = request.getParameter("captcha");
if (checkUser(username, password) && captcha.equalsIgnoreCase((String) request.getSession().getAttribute("captcha"))) {
// 登录成功,将用户名存储到Session中
request.getSession().setAttribute("username", username);
response.sendRedirect("main.jsp");
} else {
// 登录失败,重定向到登录页面
response.sendRedirect("login.jsp?error=true");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
该示例代码实现了用户登录逻辑。在接收到提交的表单数据后,首先校验用户名和密码是否正确,验证码是否正确。如果验证通过,则将用户名存储到Session中,并重定向到主页;如果验证失败,则重定向到登录页面。
以上为详细讲解“JavaWeb简单用户登录注册实例代码(有验证码)”的完整攻略,如果还有需要可以再提问。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb简单用户登录注册实例代码(有验证码) - Python技术站