Код выглядит следующим образом:
импортировать java.awt.Color;
импортировать java.awt.Font;
импортировать java.awt.Graphics;
импортировать java.awt.image.BufferedImage;
импортировать java.util.Random;
импортировать javax.imageio.ImageIO;
импортировать javax.servlet.http.HttpServletRequest;
импортировать javax.servlet.http.HttpServletResponse;
/**
* <b>функция:</b> Класс инструмента генерации кода проверки.
* @projectNetWorkService
* @package com.hoo.util
* @fileName ValidCodeUtils.java
* @createDate 2010-8-3 15:05:50
*@authorhoojo
*/
@SuppressWarnings («не используется»)
общественный класс ValidCodeUtils {
/*************************************************** ***** *********************
* Ширина кода проверки
*/
общественный статический int WIDTH = 60;
/***
* Высота кода проверки
*/
общественный статический int HEIGHT = 20;
/************************************************ ***** *********************
* Цвет фона кода подтверждения COLOR_FC_BG должен быть меньше, чем COLOR_BC_BG.
*/
общественный статический int COLOR_FC_BG = 200;
/***
* Цвет фона кода подтверждения COLOR_FC_BG должен быть меньше, чем COLOR_BC_BG.
*/
общественный статический int COLOR_BC_BG = 250;
/*************************************************** ***** *********************
* Цвет фоновой линии помех кода проверки COLOR_FC_LINE должен быть меньше, чем COLOR_BC_LINE.
*/
общедоступный статический int COLOR_FC_LINE = 160;
/***
* Цвет фоновой линии помех кода проверки COLOR_FC_LINE должен быть меньше, чем COLOR_BC_LINE.
*/
общедоступный статический интервал COLOR_BC_LINE = 200;
/*************************************************** ***** ***************************
* Цвет кода подтверждения COLOR_FC_CODE должен быть меньше COLOR_BC_CODE.
*/
общедоступный статический int COLOR_FC_CODE = 20;
/***
* Цвет кода подтверждения COLOR_FC_CODE должен быть меньше COLOR_BC_CODE.
*/
общедоступный статический int COLOR_BC_CODE = 170;
/*************************************************** ***** ***************************
* Генерация цветов в указанном диапазоне
* @param fc range Значение цвета fc меньше 255
* @param bc range значение цвета bc меньше 255
* @returnColor
*/
частный статический цвет getRandColor(int fc, int bc) {
Случайный случайный = новый случайный();
если (кк <0)
ФК = 0;
если (BC < 0)
BC = 1;
если (кк > 255)
ФК = 255;
если (BC > 255)
до н.э. = 255;
если (BC == FC)
до нашей эры += 10;
интервал температуры = 0;
если (BC <fc) {
температура = до нашей эры;
BC = FC;
ФК = температура;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
вернуть новый цвет (r, g, b);
}
/**
* <b>функция:</b> метод создания изображения.
* @createDate 2010-8-3 15:06:22
*@authorhoojo
* @param запрос HttpServletRequest
* @param ответ HttpServletResponse
* @return логическое значение
* @throwsException
*/
public static boolean getImage (запрос HttpServletRequest, ответ HttpServletResponse) выдает исключение {
ответ.сброс();
response.setContentType("изображение/jpeg");
//Устанавливаем страницу, которая не будет кэшироваться
response.setHeader("Pragma", "Без кэша");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Срок действия истекает", 0);
//Создаем изображение в памяти
Изображение BufferedImage = новое BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// Получаем графический контекст
Графика img = image.getGraphics();
// Генерируем случайный класс
Случайный случайный = новый случайный();
//Установим цвет фона
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, ШИРИНА, ВЫСОТА);
//Установить шрифт
img.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// рисуем границы
// g.setColor(новый цвет());
// g.drawRect(0,0,width-1,height-1);
// Случайным образом генерируем 155 интерференционных линий, чтобы код аутентификации на изображении было трудно обнаружить другими программами
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
для (int я = 0; я <155; я++) {
int x = случайный.nextInt(ШИРИНА);
int y = случайный.nextInt(ВЫСОТА);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
img.drawLine(x, y, x + xl, y + yl);
}
// Получаем случайно сгенерированный код аутентификации (4 цифры)
Строка codeValue = "";
для (int я = 0; я <4; я++) {
//String rand = String.valueOf(random.nextInt(10));
Строка rand = getRandomChar();
codeValue = codeValue.concat(rand);
img.setFont(getRandomFont());//Случайный шрифт
//Отображение кода аутентификации на изображении
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("codeValue", codeValue);
//изображение вступает в силу
img.dispose();
// Выводим изображение на страницу
return ImageIO.write(image, "JPEG", response.getOutputStream());
}
/**
* Случайно генерируйте символы, включая прописные, строчные буквы и цифры.
* <b>функция:</b> функция
* @createDate 23.08.2010, 10:33:55
*@authorhoojo
* @возвращаться
*/
общественная статическая строка getRandomChar() {
int index = (int) Math.round(Math.random() * 2);
Строка randChar = "";
переключатель (индекс) {
регистр 0://символы в верхнем регистре
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
перерыв;
регистр 1://символы нижнего регистра
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
перерыв;
по умолчанию://номер
randChar = String.valueOf(Math.round(Math.random() * 9));
перерыв;
}
вернуть randChar;
}
/**
* <b>функция:</b> случайным образом генерирует шрифты и размеры текста.
* @createDate 23.08.2010, 10:44:22
*@authorhoojo
* @возвращаться
*/
публичный статический шрифт getRandomFont() {
String[] шрифты = {"Georgia", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"};
int fontIndex = (int)Math.round(Math.random() * (fonts.length - 1));
int FontSize = (int) Math.round(Math.random() * 4 + 16);
вернуть новый шрифт (шрифты [fontIndex], Font.PLAIN, fontSize);
}
}
Значение кода проверки сохраняется в сессии: request.getSession().setAttribute("codeValue", codeValue);
Просто сравните значение, введенное пользователем, и значение codeValue в сеансе, чтобы убедиться, что они равны;
Ниже приведена страница jsp, вызывающая сервлет: ValidCodeServlet.java.
Вышеупомянутый класс инструмента генерации кода проверки ValidCodeUtils вызывается в ValidCodeServlet.
пакет com.hoo.servlet;
импортировать java.io.IOException;
импортировать javax.servlet.ServletException;
импортировать javax.servlet.http.HttpServlet;
импортировать javax.servlet.http.HttpServletRequest;
импортировать javax.servlet.http.HttpServletResponse;
импортировать com.hoo.util.ValidCodeUtils;
@SuppressWarnings("последовательный")
общественный класс ValidCodeServlet расширяет HttpServlet {
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
пытаться {
ValidCodeUtils.getImage(запрос, ответ);
} catch (Исключение е) {
е.printStackTrace();
}
}
public void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
doGet (запрос, ответ);
}
}
Просто вызовите метод сервлета на странице jsp.
js: метод reloadValidCode
функция reloadValidCode(o) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMilliсекунды();
}
«timed=" + new Date().getMilliсекунды() здесь необходим для предотвращения кэширования IE.
HTML-тег:
<img src="${pageContext.request.contextPath }/validCodeServlet" onclick="reloadValidCode(this)"/>
Просто настройте URL-адрес напрямую с именем сервлета, которое соответствует конфигурации web.xml. Основной путь вызова ${pageContext.request.contextPath}/validCodeServlet приведет к корневому каталогу, что более безопасно.
Конфигурация validCodeServlet в web.xml
<сервлет>
<имя-сервлета>validCodeServlet</имя-сервлета>
<servlet-class>com.hoo.servlet.ValidCodeServlet</servlet-class>
</сервлет>
<сопоставление сервлетов>
<имя-сервлета>validCodeServlet</имя-сервлета>
<url-pattern>/validCodeServlet</url-pattern>
</сервлет-сопоставление>