404错误,找不到页面

404错误,找不到页面

package com.imooc.code;

import com.sun.imageio.plugins.jpeg.JPEG;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

/**
 * 验证码工具类
 */
public class CaptcahCode {
    /**
     * 验证码的生成方法
     * @param response
     * @return
     */
    public static String drawImage(HttpServletResponse response) {
        //1.定义一个字符串的拼接的StringBuffer
        StringBuilder builder = new StringBuilder();
        //准备产生字符串长度为4的随机数
        for (int i = 0; i <4 ; i++) {
            builder.append(randomChar());
        }
        String code = builder.toString();

        //2.定义图片的宽度和高度
        int width = 120;
        int height =25;
        //建立bufferedImage对象,制定图片的长度和宽度以及色彩
        BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);

        //3.获取到 Graphics2D 绘制对象,开始绘制验证码
        Graphics2D g = bi.createGraphics();
        //4.设置文字的字体和大小
        Font font = new Font("微软雅黑", Font.PLAIN, 20);
        //5.设置字体的颜色
        Color color = new Color(0, 0, 0);
        //设置字体
        g.setFont(font);
        //设置颜色
        g.setColor(color);
        //设置背景
        g.setBackground(new Color(226, 226, 226));
        //开始绘制对象
        g.clearRect(0, 0, width, height);
        //绘制形状,获取矩形对象
        FontRenderContext context = g.getFontRenderContext();
        Rectangle2D bounds = font.getStringBounds(code, context);
        //计算文件的坐标和间距
        double x = (width - bounds.getWidth()) / 2;
        double y = (height - bounds.getHeight()) / 2;
        double ascent = bounds.getY();
        double baseY = y - ascent;
        g.drawString(code, (int) x, (int) baseY);
        //结束绘制
        g.dispose();
//        System.out.println(code);
        //
        try {
            ImageIO.write(bi, "jpg", response.getOutputStream());
            //刷新响应流
            response.flushBuffer();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return code;
    }

    /**
     * 范围随机颜色
     * @param fc
     * @param bc
     * @return
     */
    public static Color getRandomColor(int fc, int bc) {
        //利用随机数
        Random random = new Random();
        //随机颜色,了解颜色-Color(red,green,blue).rgb三元色 0-255
        if(fc>255)fc=255;
        if(bc>255)bc=255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    /**
     * 算术表达式验证码
     *
     * 1.干扰线的产生
     * 2.范围随机颜色,随机数
     * @param response
     * @return
     */
    public static String drawImageVerificate(HttpServletResponse response) {
        //定义验证码的宽度和高度
        int width = 100,height=30;
        //在内存中创建图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //创建图片的上下文
        Graphics2D g = image.createGraphics();
        //产生随机对象,此随机对象主要用于算术表达式的数字
        Random random = new Random();
        //设置背景
        g.setColor(getRandomColor(240,250));
        //设置字体
        g.setFont(new Font("微软雅黑",Font.PLAIN,22));
        //开始绘制
        g.fillRect(0, 0, width, height);

        //干扰线的绘制,绘制线条到图片中
        g.setColor(getRandomColor(180, 230));
        for (int i = 0; i <100 ; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int x1 = random.nextInt(60);
            int y1 = random.nextInt(60);
            g.drawLine(x, y, x1, y1);
        }
        //开始进行对算术验证码表达式的拼接
        int num1 = (int)(Math.random()*10+1);
        int num2 = (int)(Math.random()*10+1);
        int fuhao = random.nextInt(3);//产生一个[0,2]之间的随机整数
        //记录符号
        String fuhaostr = "";
        int result = 0;
        switch (fuhao) {
            case 0:
                fuhaostr = "+";
                result = num1 + num2;
                break;
            case 1:
                fuhaostr = "-";
                result = num1 - num2;
                break;
            case 2:
                fuhaostr = "*";
                result = num1 * num2;
                break;
        }
        //拼接计算表达式,用于图片显示
        String calc = num1 + " " + fuhaostr + " " + "num2" + " = ?";
        //设置随机颜色
        g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
        //绘制表达式
        g.drawString(calc,5,25);
        //结束绘制
        g.dispose();
        try {
            //输出图片到页面
            ImageIO.write(image, "JPEG", response.getOutputStream());
            return String.valueOf(result);
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }

    }

    /**
     * 此方法用于产生随机数字母和数字
     * @return
     */
    private static char randomChar() {
        //1.定义验证码需要的字母和数字
        String string = "QWERTYUIOPASDFGHJKLZXCVBNM0123456789";
        //2.定义随机对象
        Random random = new Random();
        return string.charAt(random.nextInt(string.length()));
    }

    public static void main(String[] args) {
        CaptcahCode.drawImage(null);
    }
}
<%--
  Created by IntelliJ IDEA.
  User: QIQI
  Date: 2019/7/22
  Time: 15:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>java验证码</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  <body>
    <img src="code.jsp" alt="" id="code">
    <a href="javascript:void(0)" onclick="changeCode()">看不清?点我</a>
    <script>
      function changeCode() {
        document.getElementById("code").src = "code.jsp?d=" + new Date().getTime();
      }
    </script>
  </body>
</html>
<%@ page import="com.imooc.code.CaptcahCode" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    //1.清空浏览器缓存,目的是为了清空浏览器的缓存,因为浏览器会对网站的资源文件和图像进行记忆存储,
    //如果浏览器加载过的图片被记忆起来,记忆以后文件就不会和服务器再交互,
    //如果不清空验证码的话,可能会造成:验证码刷新后没有效果  的问题。
    response.setHeader("pragma", "no-cache");
    response.setHeader("cache-control", "no-cache");
    response.setHeader("expires", "0");

    //2.调用编写生成验证码的工具
    String code = CaptcahCode.drawImageVerificate(response);
    session.setAttribute("code", code);

    //3.如何解决getOutputStream异常问题
    out.clear();
    out = pageContext.pushBody();
%>

http://img1.sycdn.imooc.com//climg/5d36a6170001c4e108990331.jpg

http://img1.sycdn.imooc.com//climg/5d36a61700017c2208870633.jpg

http://img1.sycdn.imooc.com//climg/5d36a61700019e0c11850678.jpg


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕阿满 2019-07-23 15:58:57

同学你好,问一下同学不加verificate是否可以访问web目录下的index.jsp页面呢?建议同学试一下。

祝:学习愉快~

  • 提问者 七七_123 #1
    ???我就是要访问verificate下的index.jsp页面啊,不加verificate,访问的是又不是一个页面
    2019-07-23 16:05:41
  • 好帮手慕阿满 回复 提问者 七七_123 #2
    同学你好,建议同学先访问一下web目录下的index.jsp,查看是否正常能够访问。如果能够正常访问,建议同学检查一下报404错误的路径是否存在单词拼写错误。祝:学习愉快~
    2019-07-23 18:41:01
  • 提问者 七七_123 #3
    没有拼写错误,还是404
    2019-07-23 22:56:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10204    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师