Servlet结合java创建验证码

Servlet结合java创建验证码
备注: 以下类容只包含验证码部分
题目: 在表单登录中,实现验证码的生成,登录,以及判断
思路: 首先创建一个java类ImageCreate.java用来创建验证码图片以及生成上面的文字。
再创建一个ImageServlet.java来调用ImageCreate.java,因为表单会更新验证码,所以这个servlet也是会实现多次请求。

ImageCreate.java源码:

package com.bj169.demoServlet.work1106;

import java.awt.*;
import java.awt.image.BufferedImage;

public class ImageCreate{

/**
 * 存放当前验证码
 */
private static String CAPTCHA="";
//绘图的核心:产生一个BufferedImage
public static BufferedImage createImage(){
    //把BufferedImage看作一张画布
    BufferedImage image=new BufferedImage(200,130,BufferedImage.TYPE_INT_BGR);

    //通过画布,指定一支笔
    Graphics graphics = image.getGraphics();
    //指定画笔颜色
    graphics.setColor(new Color(200,200,200));
    //用指定的颜色填充一个矩形
    graphics.fillRect(0,0,200,130);
    drawString(graphics);
    return image;
}

public static void drawString(Graphics graphics){
    String content="0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
    String code="";
    for (int i=0;i<4;i++){
        code+=content.charAt((int)(Math.random()*61));
    }
    //设置字体大小
    graphics.setFont(new Font("Tahoma", Font.ITALIC, 50));
    //将字符串画入画布
    graphics.setColor(Color.red);
    graphics.drawString(code,30,65);

    //生成随机斜线
    for (int i=0;i<100;i++){
        int x1=(int)(Math.random()*200);
        int y1=(int)(Math.random()*130);
        int x2=(int)(Math.random()*200);
        int y2=(int)(Math.random()*130);
        //每一条线条都是随机的颜色
        graphics.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
        graphics.drawLine(x1,y1,x2,y2);  }
   //将验证码的随机字符串进行赋值
    setCaptcha(code);
}
//利用私有的方法对每一次更新后的验证码进行赋值
private static void setCaptcha(String code){
    CAPTCHA=code;
}
//公有的get方法方便登录的servlet进行验证码的判断
public static String getCaptcha(){
    return CAPTCHA;
}

}

LoginTest.html登录源码

创建一个登录测试表单,再加一点简单的样式(虽然还是很丑)
这儿用到了jQuery,如果要使用jquery,首先需要导入自己的路径下的包
如果没有下载jQuery的,在这儿提供一个连接,放置可以直接使用
src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js
在这里插入图片描述
在这里插入图片描述
因为每次的验证码的请求都应该得到不同的验证码,所以每一次的servlet请求都应该不一样,所以在arrt中拼接了一个time字符

ImageServlet源码

package com.bj169.demoServlet.work1106;

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 java.awt.image.BufferedImage;
import java.io.IOException;

@WebServlet(name = “ImageServlet”, urlPatterns = {"/ImageServlet"})
public class ImageServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding(“UTF-8”);
response.setCharacterEncoding(“UTF-8”);

    //1.指定传输的数据类型为image类型
    response.setContentType("image/jpeg");
    //2.调用ImageCreate绘图
    BufferedImage imageCreate = ImageCreate.createImage();
    //将验证码的值传入到session,可以采用session传值的方法调用验证码
    //这里就仅显式session,具体用哪一种可以自己选择
    request.getSession().setAttribute("captcha",ImageCreate.getCaptcha());
    //imageCreate.createImage();
    //3.通过字节流的形式,借助ImageIO可以将图像字节化
    ImageIO.write(imageCreate, "jpeg", response.getOutputStream());

}

//所有的get方式都过滤掉,用post方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

LoginTestServlet 源码

package com.bj169.demoServlet.work1106;

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.io.PrintWriter;
/@WebServlet(name = “LoginTestServlet”, urlPatterns = {"/LoginTestServlet"})这段代码的意思是通过注解的方式进行配置路径,就不在web.xml.中进行配置了,表单的action也就是这儿的urlPatterns的值,上面的ImageServlet的这段代码也是同一个意思。/
@WebServlet(name = “LoginTestServlet”, urlPatterns = {"/LoginTestServlet"})
public class LoginTestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码,这儿统一使用UTF-8
request.setCharacterEncoding(“UTF-8”);
response.setCharacterEncoding(“UTF-8”);
//有时候通过设置编码还是不能解决乱码问题,可以加上下面这一句代码
response.setContentType(“text/html”);
//captcha 验证码,拿到之后统一转为小写进行判断,可以自行扩展使用原大小写判
//断或者不区分大小写
String captcha = ImageCreate.getCaptcha().toLowerCase();
//获取用户输入的验证啊
String text = request.getParameter(“captcha”).toLowerCase();
//控制台中输入结果
System.out.println("captcha = " + captcha);
System.out.println("text = " + text);
//这是session中的验证码
System.out.println("session = "+request.getSession().getAttribute(“captcha”));
PrintWriter writer = response.getWriter();
通过判断反馈信息
if (captcha.equals(text)) {
writer.print(“验证通过”);
} else {
writer.print(“验证码错误!”);
}
writer.close();
}

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

}

测试

浏览器界面 正确的测试

在这里插入图片描述
在这里插入图片描述

错误的测试:

在这里插入图片描述

在这里插入图片描述

控制台

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cool_at_heart/article/details/83820088