hawk_wood 2022-05-20 15:52 采纳率: 100%
浏览 1067
已结题

写验证码,网页和idea都不报错,但就是显示不出来

写验证码,网页和idea都不报错,但就是显示不出来

Servlet代码:

package pers.hawk.bms.web;

import javax.imageio.ImageIO;
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.IOException;
import java.util.Random;

@WebServlet(loadOnStartup = 1) // 希望该 servlet 在服务器启动的时候可以先准备好
public class SecurityCode extends HttpServlet {
    Random random = new Random();

    /**
     * 获取随机字符串,作为验证码
     * @return 返回验证码字符串
     */
    private String getRandomString() {
        String string = "23456789ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz";
        StringBuilder stringBuilder = new StringBuilder();
        // 生成四个随机字符
        for ( int i = 0; i < 4; i++ ) {
            int index = random.nextInt(string.length());
            char letter = string.charAt(index);
            stringBuilder.append(letter);
        }
        return stringBuilder.toString();
    }

    /**
     * 获取背景色,0-255
     * @return 返回随机颜色
     */
    private Color getBackgroundColor() {
        // 生成三原色
        int red = random.nextInt(256);
        int green = random.nextInt(256);
        int blue = random.nextInt(256);

        return new Color(red,green,blue);
    }

    /**
     * 获取与背景色反差很大的前景色
     * @param backgroundColor 背景色
     * @return 返回前景色
     */
    private Color getForegroundColor(Color backgroundColor) {
        // 前景色和背景色最好反差大一些
        int red = 255 - backgroundColor.getRed();
        int green = 255 - backgroundColor.getGreen();
        int blue = 255 - backgroundColor.getBlue();

        return new Color(red,green,blue);
    }

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

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

        // 设置响应格式 .jpg 图片,设置 MIM 类型
        resp.setContentType("image/jpeg");
        //浏览器不缓存响应内容--验证码图片,点一次就要刷新一次,所以不能有缓存出现
        resp.setHeader("Pragma","No-cache");
        resp.setHeader("Cache-Control","no-cache");
        //设置验证码失效时间
        resp.setDateHeader("Expires",0);

        // 图片对象(缓冲区图片)
        BufferedImage bufferedImage = new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
        // 获取画布对象
        Graphics graphics = bufferedImage.getGraphics();
        // 设置背景色
        Color backgroundColor = getBackgroundColor();
        graphics.setColor(backgroundColor); // 将 backgroundColor 给画布
        // 画背景
        graphics.fillRect(0,0,80,30); // 让画布用 backgroundColor ,填充该的长方形
        // 获取前景色
        Color foregroundColor = getForegroundColor(backgroundColor);
        graphics.setColor(foregroundColor);
        // 设置字体
        graphics.setFont(new Font("黑体",Font.BOLD,26)); // 黑体 + 粗体 + 26号字
        // 将随机字符串存到 session
        String randomString = getRandomString();
        HttpSession httpSession = req.getSession();
        httpSession.setAttribute("security_code",randomString);
        System.out.println(httpSession.getAttribute("security_code"));
        graphics.drawString(randomString,10,28); // 将字符串画到画布中
        // 噪点(30 个白色正方形)(防止暴力登录)
        for ( int i = 0; i < 30; i++ ) {
            graphics.setColor(Color.white);
            int x = random.nextInt(80); // 长方形的宽
            int y = random.nextInt(30); // 长方形的高
            graphics.fillRect(x,y,1,1);
        }

        // 将内存中,这张画好的图片,输出到响应流
        ServletOutputStream servletOutputStream = resp.getOutputStream();
        // 将画好的画布,写成 jpeg 的格式,并写到响应流
        ImageIO.write(bufferedImage,"jepg",servletOutputStream); // ImageIO 图片的帮助类
    }
}

login.jsp里的部分代码

    <script type="text/javascript">
        $(function (){
            $("#security_code").click(function () {
                $(this).prop("src","securityCode?id="+Math.random());
            });

            $("#submit_button").click(function () {
                // 验证码:现在只需要验证用户已输入。
                var codeText = $("#code").val();

                //去掉验证码前后空格
                codeText = $.trim(codeText);

                if (codeText == null || codeText === "") {
                    //4 提示用户

                    $("span.error_message").text("验证码不能为空!");
                    return false;
                }
                // 去掉错误信息
                $("errorMsg").text("");
            });
        });
    </script>

    <input id="code" class="entry_field" name="security_code" type="text" placeholder="请输入验证码" autocomplete="off" tabindex="1">
    <img id="security_code" src="securityCode"/>看不清?换一张

在idea里不报错,网页控制台也不报错,而且验证码也有内容,就只是在网页页面加载不出来

网上的各种方法都试过了,都不行。
而且刚写完测试代码时,还报了405错误,“此URL不支持Http方法GET”
我就将doDet方法里的super.doGet(req,resp),改成了doPost(req,resp)
然后就是现在的情况了

  • 写回答

2条回答 默认 最新

  • hawk_wood 2022-05-20 18:09
    关注

    我将 Servlet 程序中的 ImageIO.write(bufferedImage,"jepg",servletOutputStream); 中的 jpeg 格式,改成了 jpg 格式,就可以显示出来了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 5月20日

悬赏问题

  • ¥15 将安全信息用到以下对象时发生以下错误:c:dumpstack.log.tmp 另一个程序正在使用此文件,因此无法访问
  • ¥15 速度位置规划实现精确定位的问题
  • ¥15 代码问题:df = pd.read_excel('c:\User\18343\Desktop\wpsdata.xlxs')路径读不到
  • ¥15 为什么视频算法现在全是动作识别?
  • ¥15 编写一段matlab代码
  • ¥15 用Python做岩石类别鉴定软件
  • ¥15 关于调取、提交更新数据库记录的问题
  • ¥15 之前删了盘从下vs2022遇见这个问题 搞了一整天了
  • ¥15 从Freecad中宏下载的DesignSPHysics,出现如下问题是什么原因导致的(语言-python)
  • ¥30 notepad++ 自定义代码补全提示