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 国际」许可协议进行许可。

posted @   哈士费  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示