一,创建数据库(userdb) , 创建t_user表
userdb
t_user
二,创建javaWeb项目并根据项目目录结构写入对应的代码
javaweb项目目录结构:
UserLoginServlet.java
package user.login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
@WebServlet("/UserLoginServlet")
public class UserLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
//先获取表单提交的验证码和服务器端产生的本次验证码字符串进行对比
String yzm =req.getParameter("randomCode");
//取出服务器端存储的本次验证码字符串对象
//获取session对象
HttpSession session = req.getSession();
String code = (String)session.getAttribute("randomCode");
//数据有效性检测
if (yzm==null || code == null){
//若为空 即停止执行
out.println("<script>");
out.println("alert(\"验证码获取有误!\");");
out.println("window.location.href=\"loginForm.jsp\";");
out.println("</script>");
return;//这条语句如果没有,程序依然执行;
}
if (!(yzm.equals(code))){
out.println("<script>");
out.println("alert(\"验证码输入有误!\");");
out.println("window.location.href=\"loginForm.jsp\";");
out.println("</script>");
return;
}
//验证码正确后
//获取表单用户名和密码
String usname=req.getParameter("usname");
String psword=req.getParameter("psword");
//有效性检查
if (usname == null || usname.trim().length()==0 || psword.trim().length()==0){
out.println("<script>");
out.println("alert(\"用户名和密码不能为空!\");");
out.println("window.location.href=\"loginForm.jsp\";");
out.println("</script>");
return;
}
//上面的表示数据有值
//先尝试连接数据库
/*
* jdbc 访问数据库
* 1 在项目中导入驱动包
* 2 获取Connection对象
* */
Connection conn = null;
//语句对象的作用是,向数据库系统发送sql语句,数据库执行sql语句并且返回结果
Statement stmt = null;
//定义查询返回的结果集对象
ResultSet rs = null;
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//上一行语句如果执行成功,自动产生一个DriverManager对象
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/userdb","root","123456");
//创建语句对象
stmt= conn.createStatement();
//设计sql语句,在java程序中,就是sql语句的字符串形式
// where a = b a 是数据库表中的字段 b 是 表单的字段 因为你要比对表单输入的用户名字和密码是否和数据库里一致
String sql = "select * from t_user where username= '"+usname+"' and password= '"+psword+"'";
stmt.executeQuery(sql);
rs=stmt.executeQuery(sql);
if(rs.next()){
//有用户信息,登陆成功
//需要在session中作登陆的标志
session.setAttribute("login","yes");
out.println("<script>");
out.println("alert(\"登陆成功!\");");
out.println("window.location.href=\"welcome.jsp\";");
out.println("</script>");
return;
}
else{
//没查到,登陆失败
out.println("<script>");
out.println("alert(\"用户名或密码有误!\");");
out.println("window.location.href=\"loginForm.jsp\";");
out.println("</script>");
return;
}
} catch (Exception e) {
e.printStackTrace();
}
// out.println("<h2>"+conn+"</h2>");
}
}
RandomCodeServlet.java
package random.code;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
/**
* 在服务器端,从0-9 和 A-Z之间,随机产生4位字符串,用这个字符串的内容在内存中创建一个图片对象
* 再将这个图片,用响应对象发送到客户端浏览器
* */
@WebServlet("/randomCode")
public class RandomCodeServlet extends HttpServlet {
//定义验证码图片的大小
static final int width=120;
static final int height=30;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个内存中的图片对象
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
//24位真彩色,每个像素的颜色值有2^24次方种
//获取绘画的画笔对象
Graphics g=image.getGraphics();
//给画笔g设置颜色
g.setColor(Color.white);
//给图片对象先设置background
g.fillRect(0,0,width,height);
//再设置颜色
g.setColor(Color.black);
//给图片对象描边
g.drawRect(1,1,width-2,height-2);
//给图片对象,写字符串内容
//g.drawString("AB3Y",20,25);
//在0-9 A-Z之间随机生成4位的字符串
//定义一个产生随机字符的基础字符库
String baseChar="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//随机在baseChar中,取4次字符
Random rd=new Random();
String code="";
for(int i=0;i<4;i++){
int pos=rd.nextInt(baseChar.length()); //值得范围是0-baseChar.length()-1
char ch=baseChar.charAt(pos);
code=code+ch;
}
//设置颜色
g.setColor(new Color(196,2,2));
//设置字体
g.setFont(new Font("宋体",Font.BOLD,22));
g.drawString(code,10,24);
//每次随机产生的验证码,必须存储,否则无法和用户输入的进行equals
//只能使用session对象存储
HttpSession session=req.getSession();
session.setAttribute("randomCode",code);
// //为了增加识别随机验证码的难度,画15条干扰线
// for(int i=0;i<15;i++){
// //随机生成颜色
// int r2=rd.nextInt(60)+120;
// int g2=rd.nextInt(60)+120;
// int b2=rd.nextInt(60)+120;
// int x1=rd.nextInt(width);
// int y1=rd.nextInt(height);
// int x2=rd.nextInt(width);
// int y2=rd.nextInt(height);
// g.setColor(new Color(r2,g2,b2));
// g.drawLine(x1,y1,x2,y2);
// }
//设置响应头信息
resp.setHeader("Content-Type","image/jpeg");
//不让浏览器缓存
resp.setDateHeader("Expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("pragma","no-cache");
//将图片对象写到客户端浏览器
OutputStream os=resp.getOutputStream();
//使用ImageIO对象写出去
ImageIO.write(image,"jpeg",os);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//回调doget方法
this.doGet(req, resp);
}
}
loginForm.jsp
<%--
Created by IntelliJ IDEA.
User: 80998
Date: 2024/5/8
Time: 14:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>用户登录页面</h2>
<form action="UserLoginServlet" method="post">
用户名:<input type="text " name="usname"><br><br>
密码:<input type="password" name="psword"><br><br>
验证码:<input type="text" name="randomCode"> <img src="randomCode"><br><br>
<input type="submit" value="登录">
</form>
</body>
</html>
welcome.jsp
<%--
Created by IntelliJ IDEA.
User: 80998
Date: 2024/5/8
Time: 18:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>欢迎你,登陆成功!</h2>
</body>
</html>
三,注意记得导入mysql-connector驱动包
然后在web/WEB-INFO下创建lib文件夹
将下载好的jar包粘贴到lib目录下
然后右键jar包
选则add as library即可
记得将数据库密码改成自己本地的