使用Servlet实现网页验证码功能。
1. 编写一个Servlet,实现以下功能:
(1)能够响应来自客户端的GET请求,不响应POST和其他请求;
(2)请求的url-pattern为“/checkcode”;
(3)响应请求时,向浏览器改善验证码图片,验证码由4位字符组成,字符可以是26个英文字母和10个数字。
(4)同时将验证码字符串放入session中,以便将来客户端提交验证码时检查是否一致。
2. 编写一个login.jsp,测试验证码是否有效。
(1)用户输入正确的验证码,则提示验证码正确;否则提示错误。然后继续显示一个新的验证码。
(2)用户点击验证码图片时,更换一个新的验证码。
servlet的具体代码:
package com;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
//import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* Servlet implementation class ValidateCode
*/
//@WebServlet("/ValidateCode")
public class ValidateCode extends HttpServlet {
private static final long serialVersionUID = 1L;
public static final int CODE_LENGTH = 4; //验证码长度
public static final int SINGLECODE_WIDTH = 15; //单个验证码宽度
public static final int SINGLECODE_HEIGHT = 30; //单个验证码高度
public static final int SINGLECODE_GAP = 4; //单个验证码之间间隔
public static final int IMG_WIDTH = CODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP);
public static final int IMG_HEIGHT = SINGLECODE_HEIGHT;
/**
* @see HttpServlet#HttpServlet()
*/
public ValidateCode() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
char[] codes = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ,'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z',};
//设置图片的高、宽、类型
BufferedImage Img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_BGR);
Graphics2D g = Img.createGraphics(); //获取到绘图对象
//将验证码图像背景填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
//将画笔颜色设置为黑色,用来写字
g.setColor(Color.BLACK);
//设置字体:宋体、不带格式的、字号
g.setFont(new Font("宋体", Font.PLAIN, SINGLECODE_HEIGHT + 5));
Random random =new Random();
//随机生产20跳图片干扰线条,使验证码图片中的字符不被轻易识别
for(int i = 0; i < 20; i++) {
int x = random.nextInt(IMG_WIDTH);
int y = random.nextInt(IMG_HEIGHT);
int x2 = random.nextInt(IMG_WIDTH);
int y2 = random.nextInt(IMG_HEIGHT);
g.drawLine(x, y, x + x2, y + y2);
}
StringBuffer randomCode=new StringBuffer();
for (int i = 0; i < CODE_LENGTH; i++) {
String str= String.valueOf(codes[random.nextInt(36)]);
//画出一个字符串:要画的内容,开始的位置,高度
g.drawString(str, i * (SINGLECODE_WIDTH + SINGLECODE_GAP)+ SINGLECODE_GAP / 2, IMG_HEIGHT);
randomCode.append(str);
}
// 将生产的验证码保存到Session中
HttpSession session=request.getSession();
session.setAttribute("validate", randomCode.toString());
// 设置图像缓存为no-cache。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//将最终生产的验证码图片输出到Servlet的输出流中
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(Img, "jpeg", sos);
sos.flush();
sos.close();
}
}
xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>homework6</display-name>
<servlet>
<servlet-name>ValidateCode</servlet-name>
<servlet-class>com.ValidateCode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ValidateCode</servlet-name>
<url-pattern>/checkcode</url-pattern>
</servlet-mapping>
</web-app>
login.jsp页面:
<%@ 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>验证码</title>
<script>
function reflesh(obj) {
obj.src = 'checkcode?d=' + new Date();
}
</script>
</head>
<body>
<form name="checkcode" method="get" action="">
<input type="text" name="validatecode"> <img alt="图片不能显示"
src="checkcode" id="codeImg" οnclick="reflesh(this)" title="看不清请刷新" />
<input type="submit" name="check" value="check">
</form>
</body>
<%
if (request.getParameter("check") != null) {
String str1 = session.getAttribute("validate").toString();
String str2 = request.getParameter("validatecode");
str2=str2.toUpperCase();
if (str1.equals(str2))
out.print("输入正确");
else
out.print("验证码不正确,请重新输入!");
}
%>
</html>