5. 验证码实现
1.ImageServlet
package com.fei.servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
/**
* ClassName:ImageServlet
* Description:
*
* @Author fxm
* @Create 2024/4/16 13:42
* @Version 1.0
*/
public class ImageServlet extends HttpServlet {
private String makeNum(){
Random random = new Random();
String s = random.nextInt(9999) + "";
s = "0".repeat(Math.max(0, 4 - s.length())) +s;
return s;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 如何让浏览器5s自动刷新一次
resp.setHeader("refresh","3");
// 在内存中创建图片
BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
// 得到图片
Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();
// 设置图片的背景颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
// 给图片写数据
graphics.setColor(Color.BLUE);
graphics.setFont(new Font(null,Font.BOLD,20));
String captchaText = makeNum();
graphics.drawString(captchaText,0,20);
//给图中绘制噪音点,让图片不那么好辨别
Random random = new Random(); // 创建Random类的一个实例
int randomNum = random.nextInt(100); // 使用实例调用nextInt方法
for(int j=0,n=random.nextInt(100);j<n;j++){
graphics.setColor(Color.RED);
graphics.fillRect(random.nextInt(80),random.nextInt(20),1,1);//随机噪音点
}
// 告诉浏览器这个请求用图片的方式打开
resp.setContentType("image/png");
// 网站有缓存 不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//获得随机数据,并保存session
req.getSession().setAttribute("sessionCacheData",captchaText);
// 把图片写给浏览器
ImageIO.write(bufferedImage,"png",resp.getOutputStream());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
2. LoginServlet
package com.fei.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* ClassName:LoginServlet
* Description:
*
* @Author fxm
* @Create 2024/4/17 15:45
* @Version 1.0
*/
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1 获得用户输入的验证码
String verifyCode = request.getParameter("verifyCode");
//2 获得服务器session 存放数据 ,如果没有返回null
String sessionCacheData = (String) request.getSession().getAttribute("sessionCacheData");
// *将服务器缓存session数据移除
request.getSession().removeAttribute("sessionCacheData");
// ** 判断服务器是否存在
if(sessionCacheData == null){
request.setAttribute("msg", "请不要重复提交");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
//3 比较
if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
//用户输入错误
// * 存放request作用域
request.setAttribute("msg", "验证码输入错误");
// * 请求转发
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
//...... 登录操作
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
3. login.jsp
<%--
Created by IntelliJ IDEA.
User: fei
Date: 2024/4/17
Time: 15:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<%
String msg = (String)request.getAttribute("msg");
if(msg != null){
out.print(msg);
}
%>
<!-- 使用web应用中的URL映射到LoginServlet -->
<form action="login" method="post">
用户名:<label>
<input type="text" name="username"/>
</label> <br/>
验证码:<label>
<input type="text" name="verifyCode" size="5"/>
</label>
<!-- 使用web应用中的URL映射到ImageServlet -->
<img src="img" alt="验证码"/> <br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
中的img为web.xml中ImageServlet的url
4. 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"
metadata-complete="true">
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>com.fei.servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/img</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.fei.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
5. 结果展示
作者:hashifei
出处:https://www.cnblogs.com/hashifei/p/18141100
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?