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(); %>
1
收起
正在回答 回答被采纳积分+1
从网页搭建入门Java Web2018版
- 参与学习 人
- 提交作业 1088 份
- 解答问题 10204 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星