当进入登录界面时,验证码图片自动生成,验证码图片颜色随机,字母颜色随机,该代码只是随机生成小写英文字母,没有设置大写字母和数字
点击验证码图片重新生成验证码
验证码输入错误时,提示出来
验证码输入正确后才进行登录账号和密码的验证
中大型项目中用到的,现把关键代码展示如下
login.jsp界面(注意此时已经导入过jquery包了)
CheckCodeServlet类
package com.it.servlets;
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.util.Random;
@WebServlet("/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过java中awt中提供的类绘制验证码图片
// 1.创建一张图片
int height=90;//验证码高度
int width=300;//验证码宽度
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//实例化一个图片对象
// 2.绘制图片对象,从图片对象中获取绘制图片的笔
Graphics2D pen = image.createGraphics();
//a.绘制背景
pen.setColor(getRandomColor());
pen.fillRect(0,0,width,height);//绘制实心矩形
//b.绘制验证码字符串
int letterNum=4;//验证码图片上的字符的个数
int space=20;//验证码图片上两个字母之间的空隙
int letterWidth=(width-(letterNum+1)*space)/letterNum;//计算每个字母占据的宽度
// for循环每循环一次,绘制一个字母(小写字母的ascii码:97-122)
Random random = new Random();
String code ="";
for (int i=0;i
ManagerLoginServlet类
String checkCode = req.getParameter("checkCode");
//先校验验证码,只有验证码正确时,才校验登录的账号和密码
//首先获取session,再获取session中的code属性的值,与输入框的值进行比较
if (req.getSession().getAttribute("code").equals(checkCode)){
//验证码正确时,执行登录名和登录密码的验证
}else {
//验证码错误
req.setAttribute("tips","");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
下面是完整类中的代码
login.jsp界面(注意此时已经导入过jquery包了)
<%--
Created by IntelliJ IDEA.
User: lijianglin
Date: 2022/5/19
Time: 17:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录
欢迎后台管理界面平台
返回首页
帮助
关于
管理员登录
通知
<%-- 从ManagerLoginServlet类中获取过来提示信息,取属性的value--%>
提示 ${tips}
版权所有 2021
CheckCodeServlet类
package com.it.servlets;
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.util.Random;
@WebServlet("/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过java中awt中提供的类绘制验证码图片
// 1.创建一张图片
int height=90;//验证码高度
int width=300;//验证码宽度
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//实例化一个图片对象
// 2.绘制图片对象,从图片对象中获取绘制图片的笔
Graphics2D pen = image.createGraphics();
//a.绘制背景
pen.setColor(getRandomColor());
pen.fillRect(0,0,width,height);//绘制实心矩形
//b.绘制验证码字符串
int letterNum=4;//验证码图片上的字符的个数
int space=20;//验证码图片上两个字母之间的空隙
int letterWidth=(width-(letterNum+1)*space)/letterNum;//计算每个字母占据的宽度
// for循环每循环一次,绘制一个字母(小写字母的ascii码:97-122)
Random random = new Random();
String code ="";
for (int i=0;i
ManagerLoginServlet类
package com.it.servlets;
import com.it.entity.Manager;
import com.it.service.ManagerService;
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;
import java.sql.SQLException;
//用于管理员登录验证的servlet
@WebServlet("/ManagerLoginServlet")
public class ManagerLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// doGet中写了doPost方法,可以所有方法都在doPost方法,这样不管传过来是get还是post都可以成功调用方法
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.接收账号、密码、验证码
req.setCharacterEncoding("utf-8");
// 从输入框中获取输入的内容,参数是输入框的名字。
String loginName = req.getParameter("loginName");
String loginPwd = req.getParameter("loginPwd");
String checkCode = req.getParameter("checkCode");
//先校验验证码,只有验证码正确时,才校验登录的账号和密码
//首先获取session,再获取session中的code属性的值,与输入框的值进行比较
if (req.getSession().getAttribute("code").equals(checkCode)){
//验证码正确时,执行登录名和登录密码的验证
// 2.调用ManagerService进行校验
ManagerService managerService = new ManagerService();
try {
Manager manager = managerService.checkManagerLogin(loginName, loginPwd);
// 3.判断验证结果
if (manager==null){
// 登录失败,跳转到登录界面并进行错误提示
req.setAttribute("tips","");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}else {
// 登录成功,跳转到index.jsp界面
resp.sendRedirect("index.jsp");
}
} catch (SQLException e) {
e.printStackTrace();
}
}else {
//验证码错误
req.setAttribute("tips","");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)