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 星