81,092
社区成员
发帖
与我相关
我的任务
分享
package servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ImageCode extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 首先设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 定义图片的高度和宽度
int width = 200;
int height = 40;
// 创建一个图像对象
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 得到图像的环境对象
Graphics g = image.createGraphics();
Random random = new Random();
// 用随机色填充图像背景
g.setColor(getRandomColor(160, 250));
g.fillRect(0, 0, width, height);
for (int i = 0; i < 5; i++) {
g.setColor(getRandomColor(50, 100));
int x = random.nextInt(width);
int y = random.nextInt(height);
g.drawOval(x, y, 6, 6);
}
//设置字体
String[] fonts = {"Times New Roman","Georgia","Sylfaen"};
String font=fonts[random.nextInt(fonts.length)];
//System.out.println(font);
g.setFont(new Font(font, Font.LAYOUT_LEFT_TO_RIGHT, 33));
//准备画随机数
String sRand = "";// 随机字符串
String chars = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] ch = chars.toCharArray();
for (int i = 0; i < 6; i++) {
// 生成6个数字或者字符
String rand = String.valueOf(ch[random.nextInt(chars.length())]);
sRand += rand;
//System.out.println(sRand);
int red=20 + random.nextInt(80);
int green=20 + random.nextInt(100);
int blue=20 + random.nextInt(90);
// 设置字体的颜色
g.setColor(new Color(red,green,blue));
// 将随机数字画在图像上
g.drawString(rand, 25*(i+1), 34);//在这里改变相邻字母的间距
// 生成干扰线
for (int k = 0; k < 12; k++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(9);
int y1 = random.nextInt(9);
g.drawLine(x, y, x + x1, y + y1);
}
}
//将随机生成的字符串写入session
HttpSession session=request.getSession();
session.setAttribute("code", sRand);
g.dispose();//使图像生效
ImageIO.write(image, "JPEG", response.getOutputStream());//输出图像到页面
}
/**
* 产生一个随机颜色
*
* @param fc
* 颜色分量最小值
* @param bc
* 颜色分量最大值
*/
public Color getRandomColor(int fc, int bc) {
Random random = new Random();
int t=random.nextInt(8);
int[] r={247,243,201,225,220,205,247,236};
int[] g={248,223,249,238,238,245,242,243};
int[] b={216,206,218,225,204,209,185,189};
return new Color(r[t], g[t], b[t]);
//return new Color(r,g,b);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>index.jsp</title>
</head>
<body>
<form name="form" action="result.jsp" method="post">
验证码:
<input type="text" name="code">
<p>
<img src="/Common/ImageCode" border="1px"
onclick="this.src='/Common/ImageCode?num='+Math.random();"
title="看不清?单击图片重新获取" name="img"><p>
<input type="submit" value="提交">
</form><br>
<%
out.println("当前时间: "+new Date());
%>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>result.jsp</title>
</head>
<body>
<%
String code=(String)session.getAttribute("code");
String inputcode=request.getParameter("code");
inputcode=inputcode.toUpperCase();
out.println("验证码:"+code);
out.println("用户输入:"+inputcode);
%>
</body>
</html>
我写的是忽略大小写的验证码。