Tomcat工程Java文件生成图片加载不出来&&Java文件生成随机四位验证码教程

Java文件生成随机四位验证码代码及教程

package cn.itcast.chapter06.session.example;
import sun.net.www.content.text.Generic;
import javax.imageio.ImageIO;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.ByteArrayOutputStream;
import java.io.IOException;
@WebServlet("/check")            

public class ChesckServlet extends HttpServlet {
    private static int WIDTH=60;  
    private static int HEIGHT=20;  
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session =req.getSession();
        resp.setContentType("image/jpeg");
        ServletOutputStream sos = resp.getOutputStream();
        //静止缓存此图片
        resp.setHeader("pragma","No-cache");
        resp.setHeader("Cache-Control","no-cache");
        resp.setDateHeader("Expires",0);
        //创建内存,并获取图像上下文
        BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        //产生随机验证码
        char[]rands = generateCheckCode();
        //产生图像
        drawBcakground(g);
        drawRands(g, rands);
        //结束绘图过程,完成图像
        g.dispose();
        //将图像发给客户端
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(image, "JPEG",bos);
        byte[]buf =bos.toByteArray();
        resp.setContentLength(buf.length);
        //将下面的语句也改为bos.weiteTo(sos)
        sos.write(buf);
        bos.close();
        sos.close();
        session .setAttribute("check_code",new String(rands) );
    }

    private char[] generateCheckCode() {
        //定义验证码的字符表
        String chars = "0123456789zxcvbnmlkjhgfdsaqwertyuiop";
        char[] rands = new char[4];
        for (int i = 0; i < 4; i++) {
            int rand = (int)(Math.random()*36);
            rands[i] = chars.charAt(rand);
        }
        return rands;
    }
    private void drawRands(Graphics g, char [] rands){
        g.setColor(Color.BLACK);
        g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
        //在不同高度输出验证码
        g.drawString(""+rands[0],1,7);
        g.drawString(""+rands[1],16,15);
        g.drawString(""+rands[2],31,18);
        g.drawString(""+rands[3],46,16);
        System.out.println(rands);
    }
    private void drawBcakground(Graphics g){
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0, 0, WIDTH,HEIGHT);
        //产生120个干扰点
        for(int i=0;i<100;i++){
            int x = (int)(Math.random()*WIDTH  );
            int y = (int)(Math.random()*HEIGHT);
            int red = (int)(Math.random()*225);
            int green = (int)(Math.random()*225);
            int blue = (int)(Math.random()*225);
            g.setColor(new Color(red,green,blue));
            g.drawOval(x,y,1,0);
        }

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

代码不懂查看此处资料((Tomcat资料一)Servlet资料总结

问题现状

在这里插入图片描述
验证码图片加载不出来

原因如下:

一、HTML代码错误

<form name = "reg" action="/login" method="post">
    <meta charset="UTF-8">
    账号:<input type="text" name="username"/><br>
    密码:<input type="password" name="passward"/><br>
    验证码:<input type="text" name="check_code">
                <img src="/chapter06/CheckServlet"><br>
    <input type="submit" value="提交" id="bt">
</form>

正确的代码

<form name = "reg" action="/login" method="post">
    <meta charset="UTF-8">
    账号:<input type="text" name="username"/><br>
    密码:<input type="password" name="passward"/><br>
    验证码:<input type="text" name="check_code">
                <img src="/check">
    <input type="submit" value="提交" id="bt">
</form>

< img src="/check" >此处的路由对应上方Java文件的路由
对于客户端来说,由java文件生成的图片需要访问Java文件,而客户端不能直接访问Java文件,如果要访问Java文件需要配置路由,配置路由方法(点击查看

二、Java代码书写错误

代码见上方第一个标题

三、过滤器没有排除加载的资源路径

if (uri.contains("/login.html")||uri.contains("/login")||uri.contains("/index.html")||uri.contains("/check")){// 排除资源
            chain.doFilter(req,resp);

其中uri.contains("/check")就是验证码的路径

正常页面

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊~小 l i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值