Шаги генерации изображений кода проверки
Создайте объект BuffereMage.
Получите кисть BufferedImage, то есть вызовите метод getGraphics (), чтобы получить графический объект.
Вызовите метод setColor () и метод FillRect () графического объекта, чтобы установить цвет фона изображения.
Вызовите метод setColor () и метод Drawline () графического объекта, чтобы установить линию интерференции изображения.
Вызовите метод setrgb () объекта Buffered -Mage, чтобы установить шум изображения.
Вызовите метод setColor (), метод setFont () и метод ShorString () графического объекта, чтобы установить код проверки изображения.
Поскольку ширина и высота изображения кода проверки должны быть определены в соответствии со стилем веб -сайта, размер шрифта необходимо определить в соответствии с шириной и высотой изображения, и используется небольшой навык.
пакет util; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image; импорт java.awt.image.bufferedimage; импорт java.io.bytearrayoutputem; import java.io.ioexception; импорт. javax.imageio.imageio; public class verification {private static final String alphabet = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz1234567890"; / *** Сгенерировать изображение с шириной в виде ширины, высоты как высота и кода проверки как код* @param Ширина ширины изображения* @param Высота высота изображения* @param код кода строка* @return return verification code*/ public static bufferemage getimage (int, высота int, строковый код) {return getImage (width, высота, 20); } /** * Generate a width as width, height as height, The verification code is a code, the number of interference lines in the picture is lineCnt * @param width The width of the picture * @param height The height of the picture * @param code Verification code string * @param lineCnt The number of interference lines, it is recommended to be about 10, and it can be adjusted appropriately according to the result* @return Return the image verification code*/ Public Static BufferedImage GetImage (int ширина, int height, строковый код, int linecnt) {return createimage (ширина, высота, код, linecnt, 0,01); } /*** Сгенерировать изображение с шириной, высотой, высотой и кодом проверки - это код, количество интерференционных строк на картинке составляет linecnt* Коэффициент шума - это NOISERATE, то есть процент шумовых пикселей на картинке* @param ширина. Соответственно, в соответствии с результатами* @param Noiserate процент шумовых пикселей на рисунке к общему пикселям* @return Возвращает код проверки изображения*/ public static bufferemage getimage (int width, int hight, строковый код, int linecnt, двойная ноунитура) {вернуть Createimage (ширина, высота, код, linecnt, noiseart); } /** * * Сгенерируйте изображение с шириной, высотой и кодом проверки. Количество интерференционных линий на изображении составляет linecnt* Коэффициент шума является шутранным, то есть процент пикселей шума на изображении* @param Ширина ширина изображения* @param Высота высоты изображения* @param код кода. Total Pixels* @return возвращайте код проверки изображения* / private static bufferedimage createimage (int width, int height, строковый код, int linecnt, double outiseration) {int fontwidth = ((int) (ширина* 0,8)) / code.length (); int fontheight = (int) (высота * 0,7); // Чтобы генерировать хорошие коды проверки под любой шириной и высотой, // размер fontwdith - меньше в Fontheight, int fontsize = math.min (fontwidth, fontheight); // int paddingx = (int) (ширина * 0,1); int paddingy = высота - (высота - fontsize) / 2; // Создать изображение BufferedImage buffimg = new BufferedImage (ширина, высота, bufferedimage.type_int_rgb); // Получить щетку графику g = buffimg.getgraphics (); // Установить цвет кисти g.setcolor (getrandcolor (200, 255)); // затем заполните прямоугольник, то есть установите цвет фона G.FillRect (0, 0, ширина, высота); // Установить интерференционную линию для (int i = 0; i <linecnt; i ++) {// хранить, чтобы получить начальные и конечные точки интерференционной линии int xs = (int) (math.random () * ширина); int ys = (int) (math.random () * height); int xe = (int) (math.random () * ширина); int ye = (int) (math.random () * height); g.setcolor (getrandcolor (1, 255)); g.drawline (xs, ys, xe, ye); } // Добавить шум int gree = (int) (worker * width * height); for (int i = 0; i <rea; ++ i) {int x = (int) (math.random () * ширина); int y = (int) (math.random () * высота); buffimg.setrgb (x, y, (int) (math.random () * 255)); } // Установить шрифт font = new Font ("Ravie", font.plain, fontsize); g.setfont (шрифт); for (int i = 0; i <code.length (); ++ i) {string ch = code.substring (i, i+1); g.setcolor (getrandcolor (1, 199)); G.DrawString (Ch, PaddingX + FontWidth * I, Paddingy); } return buffimg; } / *** Получить случайный цвет, значения r, g, b находятся между L и R* @param L левый интервал* @param r Правый интервал* @return возвращать случайное значение цвета* / частный статический цвет getrandcolor (int l, int r) {if (l> 255) l = 255; if (r> 255) r = 255; if (l <0) l = 0; if (r <0) r = 0; int интервал = r - l; int r = l + (int) (math.random () * интервал); int g = l + (int) (math.random () * интервал); int b = l + (int) (math.random () * интервал); вернуть новый цвет (r, g, b); } / *** Случайно генерирует несколько строк, состоящих из прописных и строчных букв и чисел* @param Len, случайным образом генерирует символы LEN* @return возвращает случайно сгенерированную строку, состоящую из букв верхнего и нижнего регистра и чисел* / public Static String getRandCode (int len) {String Code = ""; for (int i = 0; i <len; ++ i) {int index = (int) (math.random () * alphabet.length ()); code = code + alphabet.charat (index); } код возврата; } / *** Преобразовать изображение в байтовую массив* @param изображение изображения* @return Верните массив байтов* @throhs ioexception* / public static byte [] getbytearray (image bufferemage). Imageio.write (Image, "png", Baos); вернуть baos.tobytearray (); // BytearRayOutputStream не требует закрытия}}Используйте изображение кода проверки
В сервлете VerificationCode.java вызовите приведенный выше класс, чтобы сгенерировать изображение кода проверки, а затем верните изображение клиенту.
Защищенная void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioexception {httpsession session = request.getSession (); // случайным образом генерировать строку и сеанс записи код строки = verification.getrandCode (4); session.setattribute ("Verification", Code); BufferedImage Image = util.Verification.GetImage (100,30, код, 5); response.setContentType ("Image/png"); OutputStream out = response.getOutputStream (); out.write (util.verification.getbytearray (image)); out.flush (); out.close (); }Установите код проверки в index.jsp. Когда пользователь нажимает код проверки, он вызывает код JS, чтобы запросить сервер, чтобы получить новый код проверки. Поскольку приведенный выше сервлет, который генерирует код проверки, будет кэширован браузером, код JS должен дать сервлету случайный параметр, чтобы браузер отправил запрос на сервер, чтобы получить новый код проверки, а не читать его в кэше.
<%@page import = "util.verification"%> <%@page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! Doctype html public " "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> Вставка заголовка здесь </title> <script =" text/javascript () </title> <script = "javascript" document.getElementById ("verification"). src = "/revificationCode/verificationCode? HeheHe ="+math.random (); } </script> </head> <body> <form action = "< %= request.getContextPath ()+"/checkVerification " %>" method = "post"> код проверки: <input type = "text" name = "propeverification"> <img id = "Verification" src = "< %= request.getContextPath ()+"/verification " %>" % onclick = "refreshcode ()"> <br> <input type = "Отправить" name = "Отправить" value = "> </form> </body> </html>Наконец, в сервисе extverification.java мы определяем, правильным ли код проверки, введенный пользователем. Чтобы облегчить пользователей, код проверки, как правило, устанавливается для того, чтобы быть нечувствительным к случаям, поэтому он должен быть преобразован в строчные буквы до сравнения.
Защищенная void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioexception {httpsession session = request.getSession (); String revification = (string) session.getAttribute ("vervification"); String poormentVerification = request.getParameter ("Отправитьверификацию"); Printwriter Out = response.getWriter (); if (verification! = null && отправитьверификацию! = null) {if (verification.tolowercase (). equals (superVerification.tolowerCase ())) {out.println ("Да !!!"); } else {out.println ("нет !!!"); }} else {out.println ("нет !!!"); } session.RemoVeatTribute ("verification"); // предотвращение неоднократно отправлять формы}/** * @see httpservlet#dopost (httpservlectrequest, httpservletresponse response) */protected void dopost (httpservletrequest, httpsersvonser response) TODO Автогенерированный метод STUB DOGET (запрос, ответ); }Последний рендеринг бега выглядит следующим образом
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.