JavaWEB之Servlet实现验证码

1.新建web项目
这里写图片描述
2.在包中新建servlet文件
代码如下:

package verification.code;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Response生成验证码
 * @author 
 *
 */
 public class ImageCode extends HttpServlet {

     private static final long serialVersionUID = 1L;

     //设置图片的宽高
     private static final int WIDTH = 120;
     private static final int HEIGHT = 40;
     //设置字符,数字,排除有歧义的字母或数字
     private char[] chars = "abcdefghijkmnprstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ2345678".toCharArray();
     //创建一个随机对象
     Random random = new Random();

     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     //设置不缓存图片
     response.setHeader("Pargma", "No-cache");
     response.setHeader("Cache-Control", "No-cache");
     response.setDateHeader("Expires", 0);
        //表面响应的是图片格式
        response.setContentType("image/jpeg");
        //创建一个图片数据缓存区对象BufferedImage,相当于一个图片对象
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        //创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中,相当于一支画笔
        Graphics2D g = image.createGraphics();
        //设置背景色
        setBackGround(g);
        //画边框
        drawBorder(g);
        //画干扰线
        drawRandomLine(g);
        //画干扰雪花
        drawRandomSnow(g);
        //画随机生成字符串
        String code = drawRandomCode(g);
        //将产生的字符串放入session以备验证时使用
        HttpSession session = request.getSession();
        session.setAttribute("code", code);
//      String codei = (String) session.getAttribute("code");
//      System.out.println(codei);
        //释放图形资源
        g.dispose();
        //把图片写给浏览器显示
        ImageIO.write(image, "jpg", response.getOutputStream());
        }
        //定义一个获取随机颜色的方法
        private Color setRandomColor(int start, int end) {
            int r, g, b;
            if (start > 255)
                start = 255;
            if (end > 255)
                end = 255;
            r = start + random.nextInt(end - start);
            g = start + random.nextInt(end - start);
            b = start + random.nextInt(end - start);
            return new Color(r, g, b);
        }
        //设置背景色
        private void setBackGround(Graphics2D g) {
            g.setColor(setRandomColor(157, 255));
            //填充矩形
            g.fillRect(0, 0, WIDTH, HEIGHT);
        }
        //画边框
        private void drawBorder(Graphics2D g) {
            //设置边框颜色
            g.setColor(setRandomColor(0, 156));
            //画边框
            g.drawRect(1, 1, WIDTH-3, HEIGHT-3);
        }
        //画干扰线
        private void drawRandomLine(Graphics2D g) {
            //画6条干扰线
            for (int i = 0; i < 6; i++) {
                g.setColor(setRandomColor(0,156));
                int x1 = random.nextInt(100) + 10;
                int y1 = random.nextInt(30) + 5;
                int x2 = random.nextInt(100) + 10;
                int y2 = random.nextInt(30) + 5;
                g.drawLine(x1, y1, x2, y2);
            }
        }
        //画干扰雪花
        private void drawRandomSnow(Graphics2D g) {
            //画50个雪花
            for (int i = 0; i < 50; i++) {
                g.setColor(setRandomColor(157, 255));
                int x = random.nextInt(100) + 10;
                int y = random.nextInt(30) + 10;
                g.drawString("*", x, y);
            }
        }
        //画随机生成字符串
        private String drawRandomCode(Graphics2D g) {
            //生成四位字符串
            int x = WIDTH/4;//为后面隔开字符串距离
            int index;
            StringBuffer s = new StringBuffer();
            for (int i = 0; i < 4; i++) {
                index = random.nextInt(chars.length);
                g.setColor(setRandomColor(0, 156));
                //设置字体格式和大小
                g.setFont(new Font("黑体", Font.BOLD, 25));
                //设置一个随机角度
                double angle = (random.nextInt()%30)*Math.PI/180;
                //旋转
                g.rotate(angle, (i*x)+8, random.nextInt(10)+25);
                g.drawString(chars[index]+"", (i*x)+8, random.nextInt(10)+25);
                g.rotate(-angle, (i*x)+8, random.nextInt(10)+25);
                s.append(chars[index]);
            }
            return s.toString();
        }

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        doGet(request, response);
    }
}

3.web.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>test</display-name>
  <servlet>
    <servlet-name>ImageCode</servlet-name>
    <servlet-class>verification.code.ImageCode</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ImageCode</servlet-name>
    <url-pattern>/ImageCode</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

4.执行结果截图
浏览器执行结果:
这里写图片描述

控制台获取字符串:
这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值