`
MoonMonster
  • 浏览: 35830 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

jsp---网页验证码

    博客分类:
  • jsp
阅读更多

用来实现网页中的随机验证码功能,当然,只是实现了该出现功能,并没有实现判断对错功能,要做的话其实也是很简单的。

 

 

package servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * @author Chalmers
 * @version 创建时间:2016年3月10日 下午7:41:25
 */
public class ImageServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	// 随机出现的字符
	private static final String CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	static Random random = new Random();
	// 字符长度为6
	private static final int NUM = 6;

	/**
	 * 获得随机字符串
	 * 
	 * @return String
	 */
	private String getRandomString() {

		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < NUM; i++) {
			// 追加
			sb.append(CHARS.charAt(random.nextInt(CHARS.length())));
		}

		return sb.toString();
	}

	/**
	 * 返回字体颜色
	 * 
	 * @return Color
	 */
	private Color getFontColor() {
		Color c = null;

		// 采用rgb形式的颜色,随机生成三个小于255的整数
		c = new Color(random.nextInt(255), random.nextInt(255),
				random.nextInt(255));

		return c;
	}

	/**
	 * 获得背景颜色
	 * 
	 * @return Color
	 */
	private Color getBgColor(Color c) {

		// 采用与字体不一样的颜色
		// 为了避免字体与背景颜色一样,而影响观察
		return new Color(255 - c.getBlue(), 255 - c.getGreen(),
				255 - c.getRed());
	}

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 得到session对象,用来存储随机字符串的值
		HttpSession session = request.getSession(true);
		response.setContentType("image/jpeg");

		// 得到随机字符串
		String randomString = getRandomString();
		session.setAttribute("randomString", randomString);
		// 设置图片的宽和高
		int width = 90;
		int height = 30;
		// 得到字体颜色
		Color fontColor = getFontColor();
		// 得到背景颜色
		Color bgColor = getBgColor(fontColor);

		// 创建一个图片对象(该图片放置在内存中)
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_BGR);
		// 创建绘图对象,从image得到绘图对象,会把数据绘制到image上
		Graphics2D g = image.createGraphics();
		// 设置字体样式
		g.setFont(new Font("宋体", Font.BOLD, 24));
		// 设置背景颜色
		g.setColor(bgColor);
		// 对图片进行填充
		g.fillRect(0, 0, width, height);

		// 设置字体颜色
		g.setColor(fontColor);
		// 在图片上绘制字符串
		for (int i = 0; i < randomString.length(); i++) {
			g.drawString(randomString.charAt(i) + "", 8 + i * 12, 22);
		}
		// 画出干扰点
		for (int i = 0, n = random.nextInt(100); i < n; i++) {
			// 设置点的位置以及大小
			g.fillRect(random.nextInt(width), random.nextInt(height), 1, 1);
		}
		// 将图片输出到浏览器中
		ServletOutputStream outStream = response.getOutputStream();
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);

		encoder.encode(image);
		outStream.flush();

		outStream.close();
	}
}

 

 

在网页中使用

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<img src="ImageServlet" />
</body>
</html>

 

 

当然,要记得在xml文件中配置servlet

<servlet>
	<servlet-name>ImageServlet</servlet-name>
	<servlet-class>servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>ImageServlet</servlet-name>
	<url-pattern>/ImageServlet</url-pattern>
</servlet-mapping>

 

1
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics