本文使用IDEA实现数据库连接的验证码登录功能
1.Project截图
2.代码
login.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<script type="text/javascript" src="jquery-3.3.1.js">
</script>
<script type="text/javascript" >
function reloadCheckImg(){
$("img").attr("src","img.jsp?t="+(new Date().getTime()));
}
</script>
<title>登录</title>
</head>
<body>
<form action="LoginServlet" method="post">
用户名:<input type="text" placeholder="亲,请输入用户名" name="username">
密码:<input type="text" placeholder="亲,请输入密码" name="password">
验证码:<input type="text" name="checkcode" id="checkcodeId" size="4" />
<a href="javascript:reloadCheckImg();"><img src="img.jsp" /></a>
<input type="submit" value="登录">
<span id="tip"></span>
</form>
</body>
</html>
UserDaoImpl.java
package org.app.dao.impl;
import org.app.dao.IUserDao;
import org.app.entity.User;
import java.sql.*;
public class UserDaoImpl implements IUserDao {
private static final String url = "jdbc:mysql://localhost:3306/travel?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
private static final String USERNAME = "root";
private static final String PWD = "123456";
User user = null;
PreparedStatement pstmt = null;
Connection connection = null;
ResultSet rs = null;
@Override
public User getUser(String user_name) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(url, USERNAME, PWD);
String sql = "select * from users where user_name = ?";
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, user_name);
rs = pstmt.executeQuery();
if (rs.next()) {
String password = rs.getString("user_password");
user = new User(user_name, password);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
}
IUserDao.java
package org.app.dao;
import org.app.entity.User;
public interface IUserDao {
User getUser(String user_name) throws Exception;//根据user_name查询并返回User实体供登录使用
}
User.java
package org.app.entity;
public class User {
private String user_name;
private String user_password;
public User(String user_name, String user_password) {
this.user_name = user_name;
this.user_password = user_password;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
}
LoginServlet.java
package org.app.servlet;
import org.app.dao.impl.UserDaoImpl;
import org.app.entity.User;
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 java.io.IOException;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码方式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
//从login.jsp中取出username、password
String username = request.getParameter("username");
String password = request.getParameter("password");
//根据所输入的username参数查询数据库后返回user的值
UserDaoImpl userDaoImpl = new UserDaoImpl();
User myuser = userDaoImpl.getUser(username);
String myusername = myuser.getUser_name();
String mypassword = myuser.getUser_password();
//说明:Client是用户输入的验证码,而Server是产生的真实的验证码
String checkcodeClient = request.getParameter("checkcode");
String checkcodeServer = (String)request.getSession().getAttribute("CHECKCODE");
//实现登录操作
if(myusername.equals(username) && mypassword.equals(password) && checkcodeClient.equals(checkcodeServer)){
response.getWriter().println(" <script>\n" + "alert(\"登录成功!!!!\")\n" + "</script>");
}else if(myusername == "" || mypassword == "" || checkcodeClient == ""){
response.getWriter().println(" <script>\n" + "alert(\"输入不能为空!!!!\")\n" + "</script>");
}else{
response.getWriter().println(" <script>\n" + "alert(\"登录失败!!!!\")\n" + "</script>");
}
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
img.jsp
<%@ page import="java.awt.*" %>
<%@ page import="java.util.Random" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="javax.imageio.ImageIO" %>
<%@ page contentType="image/jpeg;charset=UTF-8" language="java" %>
<%!
//随机产生颜色值
public Color getColor(){
Random ran = new Random();
int r = ran.nextInt(256);
int g = ran.nextInt(256);
int b = ran.nextInt(256);
return new Color(r,g,b);//red green blue 0-255
}
//产生验证码值
public String getNum(){
int ran = (int)(Math.random()*9000)+1000;
return String.valueOf(ran);
}
%>
<%
//禁止缓存,防止验证码过期
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expires","0");
//绘制验证码
BufferedImage image = new BufferedImage(80,30, BufferedImage.TYPE_INT_RGB);
//画笔
Graphics graphics = image.getGraphics();
graphics.fillRect(0,0,80,30);
//绘制干扰线条
for(int i = 0; i < 60 ; i++){
Random ran = new Random();
int xBegin = ran.nextInt(80);
int yBegin = ran.nextInt(30);
int xEnd = ran.nextInt(xBegin + 10);
int yEnd = ran.nextInt(yBegin + 10);
graphics.setColor(getColor());
//绘制线条
graphics.drawLine(xBegin,yBegin,xEnd,yEnd);
}
graphics.setFont(new Font("seif",Font.BOLD,20));
//绘制验证码
graphics.setColor(Color.BLACK);
String checkCode = getNum();
StringBuffer sb = new StringBuffer();
for(int i = 0;i < checkCode.length();i++){
sb.append(checkCode.charAt(i) + " ");//验证码的每一位数字
}
graphics.drawString(sb.toString(),15,20);//绘制验证码
//将验证码真实值 保存在session中,供使用时比较真实性
session.setAttribute("CHECKCODE",checkCode);
//真实的产生图片
ImageIO.write(image,"jpeg",response.getOutputStream());
//关闭
out.clear();
out = pageContext.pushBody();
%>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<script type="text/javascript" src="jquery-3.3.1.js">
</script>
<script type="text/javascript" >
function reloadCheckImg(){
$("img").attr("src","img.jsp?t="+(new Date().getTime()));
}
</script>
<title>登录</title>
</head>
<body>
<form action="LoginServlet" method="post">
用户名:<input type="text" placeholder="亲,请输入用户名" name="username">
密码:<input type="text" placeholder="亲,请输入密码" name="password">
验证码:<input type="text" name="checkcode" id="checkcodeId" size="4" />
<a href="javascript:reloadCheckImg();"><img src="img.jsp" /></a>
<input type="submit" value="登录">
<span id="tip"></span>
</form>
</body>
</html>
3.效果
首先先看数据库中所拥有的用户名和密码:
在浏览器中输入数据库中的随机一个人的用户名和密码:
点击登录后,页面跳出“登录成功!!”字样,即登陆功能实现成功。
4.相关的资源
1)jquery-3.3.1.js
2)连接数据库时所用的Jar包:
mysql-connector-java-8.0.15.jar(可以直接复制加 maven在百度上搜索就有)